/* ** File locking ** ** Snarfed from mod_rewrite.c. Munged up for our use. */ #include "ap_config.h" /* The locking support: * Try to determine whether we should use fcntl() or flock(). * Would be better ap_config.h could provide this... :-( */ #if defined(USE_FCNTL_SERIALIZED_ACCEPT) #define USE_FCNTL 1 #include #endif #if defined(USE_FLOCK_SERIALIZED_ACCEPT) #define USE_FLOCK 1 #include #endif #if !defined(USE_FCNTL) && !defined(USE_FLOCK) #define USE_FLOCK 1 #if !defined(MPE) && !defined(WIN32) #include #endif #ifndef LOCK_UN #undef USE_FLOCK #define USE_FCNTL 1 #include #endif #endif #ifdef AIX #undef USE_FLOCK #define USE_FCNTL 1 #include #endif #ifdef WIN32 #undef USE_FCNTL #define USE_LOCKING #include #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 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 return rc; }