diff options
Diffstat (limited to 'otherlibs/unix/lockf.c')
-rw-r--r-- | otherlibs/unix/lockf.c | 61 |
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"); } |