--- b.c.orig Fri Jan 20 13:38:25 1995 +++ b.c Tue Dec 28 15:56:10 1999 @@ -22,4 +22,7 @@ #endif #include +#include +#include +#include #include "config.h" @@ -202,4 +205,5 @@ else b->o=pdefault; mset(b->marks,0,sizeof(b->marks)); + b->filehandle = -1; /* initialize filehandle &&& ob */ b->rdonly=0; b->orphan=0; @@ -256,4 +260,8 @@ if(b && !--b->count) { + if (b->filehandle != -1) { + /* close filehandle, free lock &&& ob */ + close (b->filehandle); + } if(b->changed) abrerr(b->name); if(b==errbuf) errbuf=0; @@ -1672,5 +1680,6 @@ long skip,amnt; char *n; - int nowrite=0; + struct stat sb; + int nowrite=0,fh=-1; if(!s || !s[0]) @@ -1705,4 +1714,26 @@ fi=fopen(n,"r"); if(!fi) nowrite=0; +/*printf ("nowrite open=%i\n", nowrite); */ + + /* check file mod, if no write flags set, + joe in read only mode. &&& ob */ + + if (!nowrite) { + nowrite = (!stat (n, &sb)) && (!(sb.st_mode & (S_IWUSR | S_IWGRP | S_IWOTH))); + } +/*printf ("nowrite stat=%i\n", nowrite); */ + + /* lock the file if writable, or go into read only mode if + already locked, */ + + if ((fi) && (!nowrite)) { + fh = dup( fileno(fi) ); + nowrite = (flock (fh, LOCK_EX | LOCK_NB)); + } +/*printf ("nowrite flock=%i\n", nowrite); */ + +/*nowrite = 1; */ /* for test purpose */ +/*printf ("nowrite=%i\n", nowrite); */ + } joesep(n); @@ -1762,4 +1793,5 @@ b->er=error; + if( fh != -1 ) b->filehandle = fh; return b; }