* 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.
*/
/* Modified by Ruud de Rooij to support Miquel van Smoorenburg's liblockfile
#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
#include <lockfile.h>
#endif
-extern int errno;
-
#ifdef LOCKDIR
char *lockdir = LOCKDIR;
#endif
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) {
# 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
else
sleep (5);
}
+ lockname (file, &lkinfo, 1);
}
}
#else
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 */
else
snprintf (li->tmplock, sizeof(li->tmplock), "%.*s,LCK.XXXXXX",
cp - li->curlock, li->curlock);
-/*
- Mkstemp work postponed until later -Doug
-#ifdef HAVE_MKSTEMP
- mkstemp (li->tmplock);
-#else
-*/
- mktemp (li->tmplock);
-/*
-#endif
-*/
-
- unlink (li->tmplock); /* remove any stray */
}
#endif
}
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;