X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=sbr%2Flock_file.c;h=bbfc8fc7cf4249089f4c0ae4c44dcc89d9c9cdb1;hb=eba408368603a3afe170ef61a334c3a479ea5a29;hp=cda66ab6db77df7989843295db47c0f8c2219c24;hpb=3162c1b16d85ce6590bb839fd25378a28c005afc;p=mmh diff --git a/sbr/lock_file.c b/sbr/lock_file.c index cda66ab..bbfc8fc 100644 --- a/sbr/lock_file.c +++ b/sbr/lock_file.c @@ -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. @@ -19,26 +17,13 @@ #include #include +#include -#ifdef TIME_WITH_SYS_TIME +#ifdef HAVE_SYS_TIME_H # include -# include -#else -# ifdef TM_IN_SYS_TIME -# include -# else -# include -# endif #endif - -#ifdef HAVE_ERRNO_H -# include -#endif - -#ifdef MMDFONLY -# include -# include -#endif /* MMDFONLY */ +#include +#include #ifdef HAVE_FCNTL_H # include @@ -109,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, @@ -180,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)); @@ -271,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)); @@ -360,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) @@ -376,32 +365,37 @@ 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); } - lockname (file, &lkinfo, 1); } } #else @@ -435,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 */ @@ -493,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; @@ -525,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 } @@ -542,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; @@ -603,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