From: Arran Cudbard-Bell Date: Sun, 2 Dec 2012 20:57:34 +0000 (+0000) Subject: Always use fcntl for file locking X-Git-Tag: release_3_0_0_beta1~1436 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=582852042b4aa6810a683383809de234c7bd98a3;p=thirdparty%2Ffreeradius-server.git Always use fcntl for file locking --- diff --git a/configure b/configure index 0d8a4c7c42c..d2a0f692122 100755 --- a/configure +++ b/configure @@ -17605,7 +17605,7 @@ fi for ac_func in \ getopt_long \ - lockf \ + fcntl \ strsignal \ sigaction \ sigprocmask \ diff --git a/configure.in b/configure.in index d80978dd60d..1d0e24ddda4 100644 --- a/configure.in +++ b/configure.in @@ -933,7 +933,7 @@ dnl # dnl ############################################################# AC_CHECK_FUNCS( \ getopt_long \ - lockf \ + fcntl \ strsignal \ sigaction \ sigprocmask \ diff --git a/src/lib/misc.c b/src/lib/misc.c index a7e059f880c..868cf4cd548 100644 --- a/src/lib/misc.c +++ b/src/lib/misc.c @@ -49,29 +49,26 @@ const char *ip_ntoa(char *buffer, uint32_t ipaddr) return buffer; } -#undef F_LOCK - /* * Internal wrapper for locking, to minimize the number of ifdef's * - * Lock an fd, prefer lockf() over flock() + * Use fcntl or error */ int rad_lockfd(int fd, int lock_len) { -#if defined(F_LOCK) - return lockf(fd, F_LOCK, lock_len); -#elif defined(LOCK_EX) - lock_len = lock_len; /* -Wunused */ - return flock(fd, LOCK_EX); -#elif defined(F_WRLCK) +#ifdef F_WRLCK struct flock fl; + fl.l_start = 0; fl.l_len = lock_len; fl.l_pid = getpid(); fl.l_type = F_WRLCK; fl.l_whence = SEEK_CUR; + return fcntl(fd, F_SETLKW, (void *)&fl); #else +#error "missing definition for F_WRLCK, all file locks will fail" + return -1; #endif } @@ -84,20 +81,19 @@ int rad_lockfd(int fd, int lock_len) */ int rad_lockfd_nonblock(int fd, int lock_len) { -#if defined(F_LOCK) && !defined(BSD) - return lockf(fd, F_TLOCK, lock_len); -#elif defined(LOCK_EX) - lock_len = lock_len; /* -Wunused */ - return flock(fd, LOCK_EX | LOCK_NB); -#elif defined(F_WRLCK) +#ifdef F_WRLCK struct flock fl; + fl.l_start = 0; fl.l_len = lock_len; fl.l_pid = getpid(); fl.l_type = F_WRLCK; fl.l_whence = SEEK_CUR; + return fcntl(fd, F_SETLK, (void *)&fl); #else +#error "missing definition for F_WRLCK, all file locks will fail" + return -1; #endif } @@ -110,20 +106,19 @@ int rad_lockfd_nonblock(int fd, int lock_len) */ int rad_unlockfd(int fd, int lock_len) { -#if defined(F_LOCK) && !defined(BSD) - return lockf(fd, F_ULOCK, lock_len); -#elif defined(LOCK_EX) - lock_len = lock_len; /* -Wunused */ - return flock(fd, LOCK_UN); -#elif defined(F_WRLCK) +#ifdef F_WRLCK struct flock fl; + fl.l_start = 0; fl.l_len = lock_len; fl.l_pid = getpid(); fl.l_type = F_WRLCK; fl.l_whence = SEEK_CUR; + return fcntl(fd, F_UNLCK, (void *)&fl); #else +#error "missing definition for F_WRLCK, all file locks will fail" + return -1; #endif }