summaryrefslogtreecommitdiff
path: root/editors/joe2/files/patch-ad
blob: 258c8c2c2a31561cfbf90bc55d249dc60cb4390a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
--- b.c.orig	Fri Jan 20 09:38:25 1995
+++ b.c	Tue Dec  7 13:35:11 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,4 +1680,5 @@
  long skip,amnt;
  char *n;
+ struct stat sb;
  int nowrite=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)) { 
+    b->filehandle = dup (fileno (fi));
+    nowrite = (flock (b->filehandle, LOCK_EX | LOCK_NB));
+    }
+/*printf ("nowrite flock=%i\n", nowrite); */
+
+/*nowrite = 1; */	/* for test purpose */
+/*printf ("nowrite=%i\n", nowrite); */
+
   }
  joesep(n);