Reimplement flopen(3) using fcntl(2) locks instead of flock(2) locks.

This commit is contained in:
Dag-Erling Smørgrav 2008-10-20 18:02:16 +00:00
parent cb7cd07a07
commit 80de06ed6b
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=184093
2 changed files with 16 additions and 13 deletions

View File

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

View File

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