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
}
*/
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
}
*/
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
}