freebsd-ports/editors/joe/files/patch-ad
Steve Price a0ecd6930a Don't coredump when reading in a new file using ^K-R.
PR:		15741
Submitted by:	Sergey N. Voronkov <serg@dor.zaural.ru>
Reviewed by:	maintainer
1999-12-31 20:32:38 +00:00

67 lines
1.5 KiB
Plaintext

--- 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 <errno.h>
+#include <sys/file.h>
+#include <sys/types.h>
+#include <sys/stat.h>
#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;
}