From 5649afd028c62ae91a75c10a285c88e7b38e15e6 Mon Sep 17 00:00:00 2001 From: Dag-Erling Smørgrav Date: Sat, 6 Jun 2009 18:47:03 +0000 Subject: 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. --- lib/libutil/flopen.3 | 24 +++++++++--------------- lib/libutil/flopen.c | 13 +++++-------- 2 files changed, 14 insertions(+), 23 deletions(-) (limited to 'lib/libutil') diff --git a/lib/libutil/flopen.3 b/lib/libutil/flopen.3 index fe54b765c525..26d1c044aefc 100644 --- a/lib/libutil/flopen.3 +++ b/lib/libutil/flopen.3 @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd May 10, 2007 +.Dd June 6, 2009 .Dt FLOPEN 3 .Os .Sh NAME @@ -46,13 +46,12 @@ The function opens or creates a file and acquires an exclusive lock on it. It is essentially equivalent with calling .Fn open -with the same parameters followed by an -.Fn fcntl -.Dv F_SETLK -or -.Dv F_SETLKW -operation with lock type -.Dv F_WRLCK , +with the same parameters followed by +.Fn flock +with an +.Va operation +argument of +.Dv LOCK_EX , except that .Fn flopen will attempt to detect and handle races that may occur between opening @@ -87,18 +86,13 @@ returns a valid file descriptor. Otherwise, it returns -1, and sets .Va errno as described in -.Xr fcntl 2 +.Xr flock 2 and .Xr open 2 . .Sh SEE ALSO .Xr errno 2 , -.Xr fcntl 2 , +.Xr flock 2 , .Xr open 2 -.Sh HISTORY -The -.Fn flopen -function first appeared in -.Fx 6.3 . .Sh AUTHORS .An -nosplit The diff --git a/lib/libutil/flopen.c b/lib/libutil/flopen.c index ae98daf94202..754c9c037fa2 100644 --- a/lib/libutil/flopen.c +++ b/lib/libutil/flopen.c @@ -28,12 +28,11 @@ #include __FBSDID("$FreeBSD$"); +#include #include #include -#include #include -#include #include #include @@ -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); -- cgit v1.3