summaryrefslogtreecommitdiff
path: root/editors/joe2/files/patch-ad
blob: a57f81ee61e2a15918a809fa42f7c609061ab3b8 (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
59
60
61
62
63
64
65
66
--- 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;
  }