diff options
author | Dag-Erling Smørgrav <des@FreeBSD.org> | 2009-06-06 18:47:03 +0000 |
---|---|---|
committer | Dag-Erling Smørgrav <des@FreeBSD.org> | 2009-06-06 18:47:03 +0000 |
commit | d1ed3c585dd582b203fc6d1ac5d7acf61bf97a6d (patch) | |
tree | 43b05d83be37b3bf35cf56944a03cece0fc2a444 /libutil | |
parent | a8da6514f59a0823e142e9898a0edffb7e12d06b (diff) | |
download | pw-darwin-d1ed3c585dd582b203fc6d1ac5d7acf61bf97a6d.tar.gz pw-darwin-d1ed3c585dd582b203fc6d1ac5d7acf61bf97a6d.tar.zst 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.
Diffstat (limited to 'libutil')
-rw-r--r-- | libutil/flopen.c | 13 |
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); |