summaryrefslogtreecommitdiff
path: root/APACHE_1_3_42/src/lib/sdbm/sdbm_lock.c
diff options
context:
space:
mode:
Diffstat (limited to 'APACHE_1_3_42/src/lib/sdbm/sdbm_lock.c')
-rw-r--r--APACHE_1_3_42/src/lib/sdbm/sdbm_lock.c125
1 files changed, 125 insertions, 0 deletions
diff --git a/APACHE_1_3_42/src/lib/sdbm/sdbm_lock.c b/APACHE_1_3_42/src/lib/sdbm/sdbm_lock.c
new file mode 100644
index 0000000000..2ebb2a9b54
--- /dev/null
+++ b/APACHE_1_3_42/src/lib/sdbm/sdbm_lock.c
@@ -0,0 +1,125 @@
+/*
+** File locking
+**
+** Snarfed from mod_rewrite.c. Munged up for our use.
+*/
+
+#include "ap_config.h"
+#include "sdbm_tune.h" /* include the prototypes */
+
+ /* The locking support:
+ * Try to determine whether we should use fcntl() or flock().
+ * Would be better ap_config.h could provide this... :-(
+ * Small monkey business to ensure that fcntl is preferred,
+ * unless we specified USE_FLOCK_SERIALIZED_ACCEPT during compile.
+ */
+#if defined(HAVE_FCNTL_SERIALIZED_ACCEPT) && !defined(USE_FLOCK_SERIALIZED_ACCEPT)
+#define USE_FCNTL 1
+#include <fcntl.h>
+#elif defined(HAVE_FLOCK_SERIALIZED_ACCEPT)
+#define USE_FLOCK 1
+#include <sys/file.h>
+#endif
+#if !defined(USE_FCNTL) && !defined(USE_FLOCK)
+#define USE_FLOCK 1
+#if !defined(MPE) && !defined(WIN32) && !defined(NETWARE)
+#include <sys/file.h>
+#endif
+#ifndef LOCK_UN
+#undef USE_FLOCK
+#define USE_FCNTL 1
+#include <fcntl.h>
+#endif
+#endif
+#ifdef AIX
+#undef USE_FLOCK
+#define USE_FCNTL 1
+#include <fcntl.h>
+#endif
+#ifdef WIN32
+#undef USE_FCNTL
+#define USE_LOCKING
+#include <sys/locking.h>
+#endif
+#ifdef NETWARE
+#undef USE_FCNTL
+#define USE_SEM_LOCKING
+#include <nwsemaph.h>
+LONG locking_sem = 0;
+#endif
+
+
+#ifdef USE_FCNTL
+/* ugly interface requires this structure to be "live" for a while */
+static struct flock lock_it;
+static struct flock unlock_it;
+#endif
+
+/* NOTE: this function blocks until it acquires the lock */
+int sdbm_fd_lock(int fd, int readonly)
+{
+ int rc;
+
+#ifdef USE_FCNTL
+ lock_it.l_whence = SEEK_SET; /* from current point */
+ lock_it.l_start = 0; /* -"- */
+ lock_it.l_len = 0; /* until end of file */
+ lock_it.l_type = readonly ? F_RDLCK : F_WRLCK; /* set lock type */
+ lock_it.l_pid = 0; /* pid not actually interesting */
+
+ while ( ((rc = fcntl(fd, F_SETLKW, &lock_it)) < 0)
+ && (errno == EINTR) ) {
+ continue;
+ }
+#endif
+#ifdef USE_FLOCK
+ while ( ((rc = flock(fd, readonly ? LOCK_SH : LOCK_EX)) < 0)
+ && (errno == EINTR) ) {
+ continue;
+ }
+#endif
+#ifdef USE_LOCKING
+ /* ### this doesn't allow simultaneous reads! */
+ /* ### this doesn't block forever */
+ /* Lock the first byte */
+ lseek(fd, 0, SEEK_SET);
+ rc = _locking(fd, _LK_LOCK, 1);
+#endif
+#ifdef USE_SEM_LOCKING
+ if ((locking_sem != 0) && (TimedWaitOnLocalSemaphore (locking_sem, 10000) != 0))
+ rc = -1;
+ else
+ rc = 1;
+#endif
+
+ return rc;
+}
+
+int sdbm_fd_unlock(int fd)
+{
+ int rc;
+
+#ifdef USE_FCNTL
+ unlock_it.l_whence = SEEK_SET; /* from current point */
+ unlock_it.l_start = 0; /* -"- */
+ unlock_it.l_len = 0; /* until end of file */
+ unlock_it.l_type = F_UNLCK; /* unlock */
+ unlock_it.l_pid = 0; /* pid not actually interesting */
+
+ rc = fcntl(fd, F_SETLKW, &unlock_it);
+#endif
+#ifdef USE_FLOCK
+ rc = flock(fd, LOCK_UN);
+#endif
+#ifdef USE_LOCKING
+ lseek(fd, 0, SEEK_SET);
+ rc = _locking(fd, _LK_UNLCK, 1);
+#endif
+#ifdef USE_SEM_LOCKING
+ if (locking_sem)
+ SignalLocalSemaphore (locking_sem);
+ rc = 1;
+#endif
+
+ return rc;
+}