-
-/*
- * lock.c -- routines to lock/unlock files
+/* lock_file.c -- routines to lock/unlock files
*
* This code is Copyright (c) 2002, by the authors of nmh. See the
* COPYRIGHT file in the root directory of the nmh distribution for
#include <h/signals.h>
#include <h/utils.h>
#include <h/mts.h>
+#include "lock_file.h"
+#include "m_mktemp.h"
#ifdef HAVE_SYS_TIME_H
# include <sys/time.h>
enum locktype { FCNTL_LOCKING, FLOCK_LOCKING, LOCKF_LOCKING, DOT_LOCKING };
-/*
- * Flags to indicate whether we've initialized the lock types, and
- * our saved lock types
- */
-static int datalockinit = 0;
-static int spoollockinit = 0;
+/* Our saved lock types. */
static enum locktype datalocktype, spoollocktype;
-
/* top of list containing all open locks */
static struct lock *l_top = NULL;
static int lkopen_flock (const char *, int, mode_t, int *);
#endif /* HAVE_FLOCK */
-static enum locktype init_locktype(const char *);
+static enum locktype init_locktype(const char *) PURE;
static int lkopen_dot (const char *, int, mode_t, int *);
static void lkclose_dot (int, const char *);
int
lkopendata(const char *file, int access, mode_t mode, int *failed_to_lock)
{
- if (! datalockinit) {
- char *cp = context_find("datalocking");
+ static bool deja_vu;
- if (cp) {
- datalocktype = init_locktype(cp);
+ if (!deja_vu) {
+ char *dl;
+
+ deja_vu = true;
+ if ((dl = context_find("datalocking"))) {
+ datalocktype = init_locktype(dl);
} else {
/* We default to fcntl locking for data files */
datalocktype = FCNTL_LOCKING;
}
-
- datalockinit = 1;
}
return lkopen(file, access, mode, datalocktype, failed_to_lock);
int lkopenspool(const char *file, int access, mode_t mode, int *failed_to_lock)
{
- if (! spoollockinit) {
- spoollocktype = init_locktype(spoollocking);
+ static bool deja_vu;
- spoollockinit = 1;
+ if (!deja_vu) {
+ deja_vu = true;
+ spoollocktype = init_locktype(spoollocking);
}
return lkopen(file, access, mode, spoollocktype, failed_to_lock);
lockname (file, &lkinfo, 1);
}
+ close(fd);
*failed_to_lock = 1;
return -1;
}
curlock = li->curlock;
if ((tmpfile = m_mktemp(li->tmplock, &fd, NULL)) == NULL) {
- advise(NULL, "unable to create temporary file in %s", li->tmplock);
+ inform("unable to create temporary file in %s", li->tmplock);
return -1;
}
fd = link(tmpfile, curlock);
(void) m_unlink(tmpfile);
- return (fd == -1 ? -1 : 0);
+ return fd == -1 ? -1 : 0;
}
#endif /* HAVE_LIBLOCKFILE */
snprintf (bp, sizeof(li->curlock) - bplen, "%s.lock", cp);
-#if !defined(HAVE_LIBLOCKFILE)
+#if defined(HAVE_LIBLOCKFILE)
+ NMH_UNUSED(isnewlock);
+#else
/*
* If this is for a new lock, create a name for
* the temporary lock file for lockit()