summaryrefslogtreecommitdiffstats
path: root/lib/libutil
diff options
context:
space:
mode:
authordes <des@FreeBSD.org>2009-06-06 18:47:03 +0000
committerdes <des@FreeBSD.org>2009-06-06 18:47:03 +0000
commit94e760567d654ada216cd794352e9deca31dff08 (patch)
tree31cf1578dd1fe8b1672c288942548b816d815953 /lib/libutil
parent78eb93ba011f848dcde1cab4b81989885ad564bf (diff)
downloadFreeBSD-src-94e760567d654ada216cd794352e9deca31dff08.zip
FreeBSD-src-94e760567d654ada216cd794352e9deca31dff08.tar.gz
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 'lib/libutil')
-rw-r--r--lib/libutil/flopen.324
-rw-r--r--lib/libutil/flopen.c13
2 files changed, 14 insertions, 23 deletions
diff --git a/lib/libutil/flopen.3 b/lib/libutil/flopen.3
index fe54b76..26d1c04 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 ae98daf..754c9c0 100644
--- a/lib/libutil/flopen.c
+++ b/lib/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);
OpenPOWER on IntegriCloud