summaryrefslogtreecommitdiff
path: root/src/libstddjb
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstddjb')
-rw-r--r--src/libstddjb/fd_islocked.c17
-rw-r--r--src/libstddjb/fd_lock.c25
-rw-r--r--src/libstddjb/fd_unlock.c20
-rw-r--r--src/libstddjb/ipc_bind_reuse_lock.c6
-rw-r--r--src/libstddjb/lock_ex.c34
-rw-r--r--src/libstddjb/lock_exnb.c35
-rw-r--r--src/libstddjb/lock_sh.c34
-rw-r--r--src/libstddjb/lock_shnb.c35
-rw-r--r--src/libstddjb/lock_un.c34
-rw-r--r--src/libstddjb/lock_unx.c11
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 ;
-}