diff options
author | Laurent Bercot <ska-skaware@skarnet.org> | 2020-11-29 21:02:32 +0000 |
---|---|---|
committer | Laurent Bercot <ska-skaware@skarnet.org> | 2020-11-29 21:02:32 +0000 |
commit | 90b819c6d832046840018ff08b9bc5d0e3b69c37 (patch) | |
tree | efea05788cc982395ee114474d84096e7fc70862 /src/libstddjb/fd_lock.c | |
parent | e6c5c984461dc4cec0ef2d68524d6bd457e23853 (diff) | |
download | skalibs-90b819c6d832046840018ff08b9bc5d0e3b69c37.tar.xz |
Revamp lock primitives; prepare for 2.10.0.0 instead of 2.9.4.0
flock() doesn't have a way to test for a lock without taking it.
lockf() doesn't have shared locks.
The only way to have both is fcntl(). So I rewrote all the
locking stuff around fcntl(), and used the opportunity to change
the interface.
The point of changing the interface is to stop having to bother
with the old one, so to hell with compatibility, let's just do a
major bump.
Diffstat (limited to 'src/libstddjb/fd_lock.c')
-rw-r--r-- | src/libstddjb/fd_lock.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/libstddjb/fd_lock.c b/src/libstddjb/fd_lock.c new file mode 100644 index 0000000..422e667 --- /dev/null +++ b/src/libstddjb/fd_lock.c @@ -0,0 +1,25 @@ +/* ISC license. */ + +#include <fcntl.h> +#include <errno.h> + +#include <skalibs/error.h> +#include <skalibs/djbunix.h> + +int fd_lock (int fd, int w, int nb) +{ + struct flock fl = + { + .l_type = w ? F_WRLCK : F_RDLCK, + .l_whence = SEEK_SET, + .l_start = 0, + .l_len = 0 + } ; + int e = errno ; + int r ; + do r = fcntl(fd, nb ? F_SETLK : F_SETLKW, &fl) ; + while (r < 0 && errno == EINTR) ; + return r >= 0 ? 1 : + errno == EACCES || error_isagain(errno) ? (errno = e, 0) : + -1 ; +} |