Fixed make_bcc_file () to use contents of From: in draft, if draft_from masquerade...
[mmh] / sbr / lock_file.c
index 7280464..66eab72 100644 (file)
@@ -19,6 +19,7 @@
  
 #include <h/mh.h>
 #include <h/signals.h>
+#include <h/utils.h>
 
 #ifdef TIME_WITH_SYS_TIME
 # include <sys/time.h>
 # include <errno.h>
 #endif
 
-#ifdef MMDFONLY
-# include <mmdfonly.h>
-# include <lockonly.h>
-#endif /* MMDFONLY */
-
 #ifdef HAVE_FCNTL_H
 # include <fcntl.h>
 #else
@@ -56,8 +52,6 @@
 #include <lockfile.h>
 #endif
 
-extern int errno;
-
 #ifdef LOCKDIR
 char *lockdir = LOCKDIR;
 #endif
@@ -201,10 +195,22 @@ lkfopen (char *file, char *mode)
 
     if (strcmp (mode, "r") == 0)
        access = O_RDONLY;
-    else
+    else if (strcmp (mode, "r+") == 0)
        access = O_RDWR;
+    else if (strcmp (mode, "w") == 0)
+       access = O_WRONLY | O_CREAT | O_TRUNC;
+    else if (strcmp (mode, "w+") == 0)
+       access = O_RDWR | O_CREAT | O_TRUNC;
+    else if (strcmp (mode, "a") == 0)
+       access = O_WRONLY | O_CREAT | O_APPEND;
+    else if (strcmp (mode, "a+") == 0)
+       access = O_RDWR | O_CREAT | O_APPEND;
+    else {
+       errno = EINVAL;
+       return NULL;
+    }
 
-    if ((fd = lkopen (file, access, 0)) == -1)
+    if ((fd = lkopen (file, access, 0666)) == -1)
        return NULL;
 
     if ((fp = fdopen (fd, mode)) == NULL) {
@@ -314,7 +320,8 @@ lkopen_kernel (char *file, int access, mode_t mode)
 # endif
 
 # ifdef FLOCK_LOCKING
-       if (flock (fd, LOCK_EX | LOCK_NB) != -1)
+       if (flock (fd, (((access & 03) == O_RDONLY) ? LOCK_SH : LOCK_EX)
+                  | LOCK_NB) != -1)
            return fd;
 # endif
 
@@ -390,6 +397,7 @@ lkopen_dot (char *file, int access, mode_t mode)
                else
                    sleep (5);
            }
+           lockname (file, &lkinfo, 1);
        }
     }
 #else
@@ -530,15 +538,11 @@ timerON (char *curlock, int fd)
     struct lock *lp;
     size_t len;
 
-    if (!(lp = (struct lock *) malloc (sizeof(*lp))))
-       return;
+    lp = (struct lock *) mh_xmalloc (sizeof(*lp));
 
     len = strlen(curlock) + 1;
     lp->l_fd = fd;
-    if (!(lp->l_lock = malloc (len))) {
-       free ((char *) lp);
-       return;
-    }
+    lp->l_lock = mh_xmalloc (len);
     memcpy (lp->l_lock, curlock, len);
     lp->l_next = l_top;