summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authordes <des@FreeBSD.org>2008-10-20 18:02:16 +0000
committerdes <des@FreeBSD.org>2008-10-20 18:02:16 +0000
commitfd059e9b04b42452a89985b02276be2265480dca (patch)
tree0584909d4e914795b737773d9f8a066576f4cb3c /lib
parent9a22db9431ce7e5719c00e9a183d0d1c6cdce048 (diff)
downloadFreeBSD-src-fd059e9b04b42452a89985b02276be2265480dca.zip
FreeBSD-src-fd059e9b04b42452a89985b02276be2265480dca.tar.gz
Reimplement flopen(3) using fcntl(2) locks instead of flock(2) locks.
Diffstat (limited to 'lib')
-rw-r--r--lib/libutil/flopen.317
-rw-r--r--lib/libutil/flopen.c12
2 files changed, 16 insertions, 13 deletions
diff --git a/lib/libutil/flopen.3 b/lib/libutil/flopen.3
index 97a48f1..fe54b76 100644
--- a/lib/libutil/flopen.3
+++ b/lib/libutil/flopen.3
@@ -46,12 +46,13 @@ 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
-.Fn flock
-with an
-.Va operation
-argument of
-.Dv LOCK_EX ,
+with the same parameters followed by an
+.Fn fcntl
+.Dv F_SETLK
+or
+.Dv F_SETLKW
+operation with lock type
+.Dv F_WRLCK ,
except that
.Fn flopen
will attempt to detect and handle races that may occur between opening
@@ -86,12 +87,12 @@ returns a valid file descriptor.
Otherwise, it returns -1, and sets
.Va errno
as described in
-.Xr flock 2
+.Xr fcntl 2
and
.Xr open 2 .
.Sh SEE ALSO
.Xr errno 2 ,
-.Xr flock 2 ,
+.Xr fcntl 2 ,
.Xr open 2
.Sh HISTORY
The
diff --git a/lib/libutil/flopen.c b/lib/libutil/flopen.c
index 23742f7..a5bf8c6 100644
--- a/lib/libutil/flopen.c
+++ b/lib/libutil/flopen.c
@@ -28,12 +28,12 @@
#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,6 +42,7 @@ int
flopen(const char *path, int flags, ...)
{
int fd, operation, serrno, trunc;
+ struct flock flock;
struct stat sb, fsb;
mode_t mode;
@@ -58,9 +59,10 @@ flopen(const char *path, int flags, ...)
va_end(ap);
}
- operation = LOCK_EX;
- if (flags & O_NONBLOCK)
- operation |= LOCK_NB;
+ memset(&flock, 0, sizeof flock);
+ flock.l_type = F_WRLCK;
+ flock.l_whence = SEEK_SET;
+ operation = (flags & O_NONBLOCK) ? F_SETLK : F_SETLKW;
trunc = (flags & O_TRUNC);
flags &= ~O_TRUNC;
@@ -69,7 +71,7 @@ flopen(const char *path, int flags, ...)
if ((fd = open(path, flags, mode)) == -1)
/* non-existent or no access */
return (-1);
- if (flock(fd, operation) == -1) {
+ if (fcntl(fd, operation, &flock) == -1) {
/* unsupported or interrupted */
serrno = errno;
close(fd);
OpenPOWER on IntegriCloud