diff options
Diffstat (limited to 'src/libstddjb')
-rw-r--r-- | src/libstddjb/fd_islocked.c | 17 | ||||
-rw-r--r-- | src/libstddjb/fd_lock.c | 25 | ||||
-rw-r--r-- | src/libstddjb/fd_unlock.c | 20 | ||||
-rw-r--r-- | src/libstddjb/ipc_bind_reuse_lock.c | 6 | ||||
-rw-r--r-- | src/libstddjb/lock_ex.c | 34 | ||||
-rw-r--r-- | src/libstddjb/lock_exnb.c | 35 | ||||
-rw-r--r-- | src/libstddjb/lock_sh.c | 34 | ||||
-rw-r--r-- | src/libstddjb/lock_shnb.c | 35 | ||||
-rw-r--r-- | src/libstddjb/lock_un.c | 34 | ||||
-rw-r--r-- | src/libstddjb/lock_unx.c | 11 |
10 files changed, 67 insertions, 184 deletions
diff --git a/src/libstddjb/fd_islocked.c b/src/libstddjb/fd_islocked.c new file mode 100644 index 0000000..bf9f9e8 --- /dev/null +++ b/src/libstddjb/fd_islocked.c @@ -0,0 +1,17 @@ +/* ISC license. */ + +#include <fcntl.h> + +#include <skalibs/djbunix.h> + +int fd_islocked (int fd) +{ + struct flock fl = + { + .l_type = F_RDLCK, + .l_whence = SEEK_SET, + .l_start = 0, + .l_len = 0 + } ; + return fcntl(fd, F_GETLK, &fl) < 0 ? -1 : fl.l_type != F_UNLCK ; +} 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 ; +} diff --git a/src/libstddjb/fd_unlock.c b/src/libstddjb/fd_unlock.c new file mode 100644 index 0000000..4c63fd9 --- /dev/null +++ b/src/libstddjb/fd_unlock.c @@ -0,0 +1,20 @@ +/* ISC license. */ + +#include <fcntl.h> +#include <errno.h> + +#include <skalibs/djbunix.h> + +void fd_unlock (int fd) +{ + struct flock fl = + { + .l_type = F_UNLCK, + .l_whence = SEEK_SET, + .l_start = 0, + .l_len = 0 + } ; + int e = errno ; + fcntl(fd, F_SETLK, &fl) ; + errno = e ; +} diff --git a/src/libstddjb/ipc_bind_reuse_lock.c b/src/libstddjb/ipc_bind_reuse_lock.c index aede744..b1bccfd 100644 --- a/src/libstddjb/ipc_bind_reuse_lock.c +++ b/src/libstddjb/ipc_bind_reuse_lock.c @@ -4,6 +4,7 @@ #include <string.h> #include <unistd.h> +#include <errno.h> #include <sys/socket.h> #include <skalibs/djbunix.h> @@ -14,12 +15,15 @@ int ipc_bind_reuse_lock (int s, char const *p, int *fdlock) unsigned int opt = 1 ; size_t len = strlen(p) ; int fd ; + int r ; char lockname[len + 6] ; memcpy(lockname, p, len) ; memcpy(lockname + len, ".lock", 6) ; fd = openc_create(lockname) ; if (fd < 0) return -1 ; - if (lock_exnb(fd) < 0) return -1 ; + r = fd_lock(fd, 1, 1) ; + if (r < 0) return -1 ; + if (!r) return (errno = EBUSY, -1) ; setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof opt) ; unlink(p) ; if (ipc_bind(s, p) < 0) return -1 ; diff --git a/src/libstddjb/lock_ex.c b/src/libstddjb/lock_ex.c deleted file mode 100644 index 2645fab..0000000 --- a/src/libstddjb/lock_ex.c +++ /dev/null @@ -1,34 +0,0 @@ -/* ISC license. */ - -#include <skalibs/sysdeps.h> - -#ifdef SKALIBS_HASFLOCK - -#include <skalibs/nonposix.h> -#include <errno.h> -#include <sys/file.h> -#include <skalibs/djbunix.h> - -int lock_ex (int fd) -{ - int r ; - do r = flock(fd, LOCK_EX) ; - while ((r == -1) && (errno == EINTR)) ; - return r ; -} - -#else - -#include <unistd.h> -#include <errno.h> -#include <skalibs/djbunix.h> - -int lock_ex (int fd) -{ - int r ; - do r = lockf(fd, F_LOCK, 0) ; - while ((r == -1) && (errno == EINTR)) ; - return r ; -} - -#endif diff --git a/src/libstddjb/lock_exnb.c b/src/libstddjb/lock_exnb.c deleted file mode 100644 index 7d5302f..0000000 --- a/src/libstddjb/lock_exnb.c +++ /dev/null @@ -1,35 +0,0 @@ -/* ISC license. */ - -#include <skalibs/sysdeps.h> - -#ifdef SKALIBS_HASFLOCK - -#include <skalibs/nonposix.h> -#include <errno.h> -#include <sys/file.h> -#include <skalibs/djbunix.h> - -int lock_exnb (int fd) -{ - int r ; - do r = flock(fd, LOCK_EX | LOCK_NB) ; - while ((r == -1) && (errno == EINTR)) ; - return r ; -} - -#else - -#include <unistd.h> -#include <errno.h> -#include <skalibs/djbunix.h> - -int lock_exnb (int fd) -{ - int r ; - do r = lockf(fd, F_TLOCK, 0) ; - while ((r == -1) && (errno == EINTR)) ; - if ((r == -1) && (errno == EACCES)) errno = EAGAIN ; - return r ; -} - -#endif diff --git a/src/libstddjb/lock_sh.c b/src/libstddjb/lock_sh.c deleted file mode 100644 index c942d0d..0000000 --- a/src/libstddjb/lock_sh.c +++ /dev/null @@ -1,34 +0,0 @@ -/* ISC license. */ - -#include <skalibs/sysdeps.h> - -#ifdef SKALIBS_HASFLOCK - -#include <skalibs/nonposix.h> -#include <errno.h> -#include <sys/file.h> -#include <skalibs/djbunix.h> - -int lock_sh (int fd) -{ - int r ; - do r = flock(fd, LOCK_SH) ; - while ((r == -1) && (errno == EINTR)) ; - return r ; -} - -#else - -#include <unistd.h> -#include <errno.h> -#include <skalibs/djbunix.h> - -int lock_sh (int fd) -{ - int r ; - do r = lockf(fd, F_LOCK, 0) ; - while ((r == -1) && (errno == EINTR)) ; - return r ; -} - -#endif diff --git a/src/libstddjb/lock_shnb.c b/src/libstddjb/lock_shnb.c deleted file mode 100644 index 40c988d..0000000 --- a/src/libstddjb/lock_shnb.c +++ /dev/null @@ -1,35 +0,0 @@ -/* ISC license. */ - -#include <skalibs/sysdeps.h> - -#ifdef SKALIBS_HASFLOCK - -#include <skalibs/nonposix.h> -#include <errno.h> -#include <sys/file.h> -#include <skalibs/djbunix.h> - -int lock_shnb (int fd) -{ - int r ; - do r = flock(fd, LOCK_SH | LOCK_NB) ; - while ((r == -1) && (errno == EINTR)) ; - return r ; -} - -#else - -#include <unistd.h> -#include <errno.h> -#include <skalibs/djbunix.h> - -int lock_shnb (int fd) -{ - int r ; - do r = lockf(fd, F_TLOCK, 0) ; - while ((r == -1) && (errno == EINTR)) ; - if ((r == -1) && (errno == EACCES)) errno = EAGAIN ; - return r ; -} - -#endif diff --git a/src/libstddjb/lock_un.c b/src/libstddjb/lock_un.c deleted file mode 100644 index a029a7c..0000000 --- a/src/libstddjb/lock_un.c +++ /dev/null @@ -1,34 +0,0 @@ -/* ISC license. */ - -#include <skalibs/sysdeps.h> - -#ifdef SKALIBS_HASFLOCK - -#include <skalibs/nonposix.h> -#include <errno.h> -#include <sys/file.h> -#include <skalibs/djbunix.h> - -int lock_un (int fd) -{ - int r ; - do r = flock(fd, LOCK_UN) ; - while ((r == -1) && (errno == EINTR)) ; - return r ; -} - -#else - -#include <unistd.h> -#include <errno.h> -#include <skalibs/djbunix.h> - -int lock_un (int fd) -{ - int r ; - do r = lockf(fd, F_ULOCK, 0) ; - while ((r == -1) && (errno == EINTR)) ; - return r ; -} - -#endif diff --git a/src/libstddjb/lock_unx.c b/src/libstddjb/lock_unx.c deleted file mode 100644 index d2f8483..0000000 --- a/src/libstddjb/lock_unx.c +++ /dev/null @@ -1,11 +0,0 @@ -/* ISC license. */ - -#include <errno.h> -#include <skalibs/djbunix.h> - -void lock_unx (int fd) -{ - int e = errno ; - lock_un(fd) ; - errno = e ; -} |