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.
This commit is contained in:
Dag-Erling Smørgrav 2009-06-06 18:47:03 +00:00
parent a27c52a943
commit 5649afd028
2 changed files with 14 additions and 23 deletions

View File

@ -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

View File

@ -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);