summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDag-Erling Smørgrav <des@FreeBSD.org>2009-06-06 18:47:03 +0000
committerDag-Erling Smørgrav <des@FreeBSD.org>2009-06-06 18:47:03 +0000
commitd1ed3c585dd582b203fc6d1ac5d7acf61bf97a6d (patch)
tree43b05d83be37b3bf35cf56944a03cece0fc2a444
parenta8da6514f59a0823e142e9898a0edffb7e12d06b (diff)
downloadpw-darwin-d1ed3c585dd582b203fc6d1ac5d7acf61bf97a6d.tar.gz
pw-darwin-d1ed3c585dd582b203fc6d1ac5d7acf61bf97a6d.zip
Revert (once again, and hopefully for the last time) to flock(2) locks.
The problem with fcntl(2) locks is that they are not inherited by child processes. This breaks pidfile(3), where the common idiom is to open and lock the PID file before daemonizing.
-rw-r--r--libutil/flopen.c13
1 files changed, 5 insertions, 8 deletions
diff --git a/libutil/flopen.c b/libutil/flopen.c
index ae98daf..754c9c0 100644
--- a/libutil/flopen.c
+++ b/libutil/flopen.c
@@ -28,12 +28,11 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include <sys/file.h>
#include <sys/stat.h>
#include <errno.h>
-#include <fcntl.h>
#include <stdarg.h>
-#include <string.h>
#include <unistd.h>
#include <libutil.h>
@@ -42,7 +41,6 @@ int
flopen(const char *path, int flags, ...)
{
int fd, operation, serrno, trunc;
- struct flock lock;
struct stat sb, fsb;
mode_t mode;
@@ -59,10 +57,9 @@ flopen(const char *path, int flags, ...)
va_end(ap);
}
- memset(&lock, 0, sizeof lock);
- lock.l_type = ((flags & O_ACCMODE) == O_RDONLY) ? F_RDLCK : F_WRLCK;
- lock.l_whence = SEEK_SET;
- operation = (flags & O_NONBLOCK) ? F_SETLK : F_SETLKW;
+ operation = LOCK_EX;
+ if (flags & O_NONBLOCK)
+ operation |= LOCK_NB;
trunc = (flags & O_TRUNC);
flags &= ~O_TRUNC;
@@ -71,7 +68,7 @@ flopen(const char *path, int flags, ...)
if ((fd = open(path, flags, mode)) == -1)
/* non-existent or no access */
return (-1);
- if (fcntl(fd, operation, &lock) == -1) {
+ if (flock(fd, operation) == -1) {
/* unsupported or interrupted */
serrno = errno;
(void)close(fd);