Removed unused function seek_home().
[mmh] / sbr / lock_file.c
index c088283..bbfc8fc 100644 (file)
@@ -2,8 +2,6 @@
 /*
  * lock.c -- routines to lock/unlock files
  *
- * $Id$
- *
  * This code is Copyright (c) 2002, by the authors of nmh.  See the
  * COPYRIGHT file in the root directory of the nmh distribution for
  * complete copyright information.
  
 #include <h/mh.h>
 #include <h/signals.h>
+#include <h/utils.h>
 
-#ifdef TIME_WITH_SYS_TIME
+#ifdef HAVE_SYS_TIME_H
 # include <sys/time.h>
-# include <time.h>
-#else
-# ifdef TM_IN_SYS_TIME
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
 #endif
-
-#ifdef HAVE_ERRNO_H
-# include <errno.h>
-#endif
-
-#ifdef MMDFONLY
-# include <mmdfonly.h>
-# include <lockonly.h>
-#endif /* MMDFONLY */
+#include <time.h>
+#include <errno.h>
 
 #ifdef HAVE_FCNTL_H
 # include <fcntl.h>
@@ -56,8 +41,6 @@
 #include <lockfile.h>
 #endif
 
-extern int errno;
-
 #ifdef LOCKDIR
 char *lockdir = LOCKDIR;
 #endif
@@ -111,13 +94,15 @@ static int lkopen_kernel (char *, int, mode_t);
 
 #ifdef DOT_LOCKING
 static int lkopen_dot (char *, int, mode_t);
-static int lockit (struct lockinfo *);
 static void lockname (char *, struct lockinfo *, int);
 static void timerON (char *, int);
 static void timerOFF (int);
-static RETSIGTYPE alrmser (int);
-#endif
+static void alrmser (int);
 
+#if !defined(HAVE_LIBLOCKFILE)
+static int lockit (struct lockinfo *);
+#endif
+#endif
 
 /*
  * Base routine to open and lock a file,
@@ -182,6 +167,8 @@ lkclose (int fd, char *file)
     lockfile_remove(lkinfo.curlock);
 #endif /* HAVE_LIBLOCKFILE */
     timerOFF (fd);                     /* turn off lock timer   */
+#else  /* DOT_LOCKING */
+    NMH_UNUSED (file);
 #endif /* DOT_LOCKING */
 
     return (close (fd));
@@ -273,6 +260,8 @@ lkfclose (FILE *fp, char *file)
     lockfile_remove(lkinfo.curlock);
 #endif /* HAVE_LIBLOCKFILE */
     timerOFF (fileno(fp));             /* turn off lock timer   */
+#else  /* DOT_LOCKING */
+    NMH_UNUSED (file);
 #endif /* DOT_LOCKING */
 
     return (fclose (fp));
@@ -362,10 +351,8 @@ lkopen_kernel (char *file, int access, mode_t mode)
 static int
 lkopen_dot (char *file, int access, mode_t mode)
 {
-    int i, fd;
-    time_t curtime;
+    int fd;
     struct lockinfo lkinfo;
-    struct stat st;
 
     /* open the file */
     if ((fd = open (file, access, mode)) == -1)
@@ -378,30 +365,36 @@ lkopen_dot (char *file, int access, mode_t mode)
     lockname (file, &lkinfo, 1);
 
 #if !defined(HAVE_LIBLOCKFILE)
-    for (i = 0;;) {
-       /* attempt to create lock file */
-       if (lockit (&lkinfo) == 0) {
-           /* if successful, turn on timer and return */
-           timerON (lkinfo.curlock, fd);
-           return fd;
-       } else {
-           /*
-            * Abort locking, if we fail to lock after 5 attempts
-            * and are never able to stat the lock file.
-            */
-           if (stat (lkinfo.curlock, &st) == -1) {
-               if (i++ > 5)
-                   return -1;
-               sleep (5);
+    {
+       int i;
+       for (i = 0;;) {
+           /* attempt to create lock file */
+           if (lockit (&lkinfo) == 0) {
+               /* if successful, turn on timer and return */
+               timerON (lkinfo.curlock, fd);
+               return fd;
            } else {
-               i = 0;
-               time (&curtime);
-
-               /* check for stale lockfile, else sleep */
-               if (curtime > st.st_ctime + RSECS)
-                   unlink (lkinfo.curlock);
-               else
+               /*
+                * Abort locking, if we fail to lock after 5 attempts
+                * and are never able to stat the lock file.
+                */
+               struct stat st;
+               if (stat (lkinfo.curlock, &st) == -1) {
+                   if (i++ > 5)
+                       return -1;
                    sleep (5);
+               } else {
+                   time_t curtime;
+                   i = 0;
+                   time (&curtime);
+                   
+                   /* check for stale lockfile, else sleep */
+                   if (curtime > st.st_ctime + RSECS)
+                       unlink (lkinfo.curlock);
+                   else
+                       sleep (5);
+               }
+               lockname (file, &lkinfo, 1);
            }
        }
     }
@@ -436,18 +429,8 @@ lockit (struct lockinfo *li)
     curlock = li->curlock;
     tmplock = li->tmplock;
 
-#ifdef HAVE_MKSTEMP
     if ((fd = mkstemp(tmplock)) == -1)
        return -1;
-#else
-    if (mktemp(tmplock) == NULL)
-       return -1;
-    if (unlink(tmplock) == -1 && errno != ENOENT)
-       return -1;
-    /* create the temporary lock file */
-    if ((fd = creat(tmplock, 0600)) == -1)
-       return -1;
-#endif
 
 #if 0
     /* write our process id into lock file */
@@ -494,7 +477,7 @@ lockname (char *file, struct lockinfo *li, int isnewlock)
     bplen += tmplen;
 #else
     if (cp != file) {
-       snprintf (bp, sizeof(li->curlock), "%.*s", cp - file, file);
+       snprintf (bp, sizeof(li->curlock), "%.*s", (int)(cp - file), file);
        tmplen = strlen (bp);
        bp    += tmplen;
        bplen += tmplen;
@@ -526,7 +509,7 @@ lockname (char *file, struct lockinfo *li, int isnewlock)
            strncpy (li->tmplock, ",LCK.XXXXXX", sizeof(li->tmplock));
        else
            snprintf (li->tmplock, sizeof(li->tmplock), "%.*s,LCK.XXXXXX",
-                    cp - li->curlock, li->curlock);
+                    (int)(cp - li->curlock), li->curlock);
     }
 #endif
 }
@@ -543,15 +526,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;
 
@@ -604,23 +583,22 @@ timerOFF (int fd)
  * lockfiles, so another command doesn't remove them.
  */
 
-static RETSIGTYPE
+static void
 alrmser (int sig)
 {
-    int j;
     char *lockfile;
     struct lock *lp;
-
-#ifndef        RELIABLE_SIGNALS
-    SIGNAL (SIGALRM, alrmser);
-#endif
+    NMH_UNUSED (sig);
 
     /* update the ctime of all the lock files */
     for (lp = l_top; lp; lp = lp->l_next) {
        lockfile = lp->l_lock;
 #if !defined(HAVE_LIBLOCKFILE)
-       if (*lockfile && (j = creat (lockfile, 0600)) != -1)
-           close (j);
+       {
+           int j;
+           if (*lockfile && (j = creat (lockfile, 0600)) != -1)
+               close (j);
+       }
 #else
     lockfile_touch(lockfile);
 #endif