summaryrefslogtreecommitdiffstats
path: root/otherlibs/unix/lockf.c
diff options
context:
space:
mode:
Diffstat (limited to 'otherlibs/unix/lockf.c')
-rw-r--r--otherlibs/unix/lockf.c61
1 files changed, 34 insertions, 27 deletions
diff --git a/otherlibs/unix/lockf.c b/otherlibs/unix/lockf.c
index 2cffcd062..0b1f34b7e 100644
--- a/otherlibs/unix/lockf.c
+++ b/otherlibs/unix/lockf.c
@@ -11,36 +11,12 @@
/* $Id$ */
-#include <mlvalues.h>
-#include "unixsupport.h"
-
-#ifdef HAS_LOCKF
-#ifdef HAS_UNISTD
-#include <unistd.h>
-#else
-#define F_ULOCK 0
-#define F_LOCK 1
-#define F_TLOCK 2
-#define F_TEST 3
-#endif
-
-static int lock_command_table[] = {
- F_ULOCK, F_LOCK, F_TLOCK, F_TEST
-};
-
-value unix_lockf(value fd, value cmd, value span) /* ML */
-{
- if (lockf(Int_val(fd), lock_command_table[Int_val(cmd)], Long_val(span))
- == -1) uerror("lockf", Nothing);
- return Val_unit;
-}
-
-#else
-
#include <errno.h>
#include <fcntl.h>
+#include <mlvalues.h>
+#include "unixsupport.h"
-#ifdef F_SETLK
+#if defined(F_GETLK) && defined(F_SETLK) && defined(F_SETLKW)
value unix_lockf(value fd, value cmd, value span) /* ML */
{
@@ -84,6 +60,14 @@ value unix_lockf(value fd, value cmd, value span) /* ML */
}
}
break;
+ case 4: /* F_RLOCK */
+ l.l_type = F_RDLCK;
+ ret = fcntl(fildes, F_SETLKW, &l);
+ break;
+ case 5: /* F_TRLOCK */
+ l.l_type = F_RDLCK;
+ ret = fcntl(fildes, F_SETLK, &l);
+ break;
default:
errno = EINVAL;
ret = -1;
@@ -94,6 +78,29 @@ value unix_lockf(value fd, value cmd, value span) /* ML */
#else
+#ifdef HAS_LOCKF
+#ifdef HAS_UNISTD
+#include <unistd.h>
+#else
+#define F_ULOCK 0
+#define F_LOCK 1
+#define F_TLOCK 2
+#define F_TEST 3
+#endif
+
+static int lock_command_table[] = {
+ F_ULOCK, F_LOCK, F_TLOCK, F_TEST, F_LOCK, F_TLOCK
+};
+
+value unix_lockf(value fd, value cmd, value span) /* ML */
+{
+ if (lockf(Int_val(fd), lock_command_table[Int_val(cmd)], Long_val(span))
+ == -1) uerror("lockf", Nothing);
+ return Val_unit;
+}
+
+#else
+
value unix_lockf(value fd, value cmd, value span)
{ invalid_argument("lockf not implemented"); }