diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2000-03-09 09:04:36 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2000-03-09 09:04:36 +0000 |
commit | 976692f8ae8377af944f09177c8e79cb94809fe9 (patch) | |
tree | 5beed6846830b95d3b130aa73e2772aa4ded0dad /missing | |
parent | 5728ed4f51b6a79355a6cd517a7ae9a6928381fe (diff) | |
download | ruby-976692f8ae8377af944f09177c8e79cb94809fe9.tar.gz |
2000-03-09
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@637 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'missing')
-rw-r--r-- | missing/flock.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/missing/flock.c b/missing/flock.c index a4a9544b56..0eaa8d8fdb 100644 --- a/missing/flock.c +++ b/missing/flock.c @@ -78,6 +78,54 @@ flock(fd, operation) } return i; } +#elif defined HAVE_FCNTL && defined HAVE_FCNTL_H + +/* These are the flock() constants. Since this sytems doesn't have + flock(), the values of the constants are probably not available. +*/ +# ifndef LOCK_SH +# define LOCK_SH 1 +# endif +# ifndef LOCK_EX +# define LOCK_EX 2 +# endif +# ifndef LOCK_NB +# define LOCK_NB 4 +# endif +# ifndef LOCK_UN +# define LOCK_UN 8 +# endif + +#include <fcntl.h> +#include <unistd.h> +#include <errno.h> + +int +flock(fd, operation) + int fd; + int operation; +{ + struct flock lock; + + switch (operation & ~LOCK_NB) { + case LOCK_SH: + lock.l_type = F_RDLCK; + break; + case LOCK_EX: + lock.l_type = F_WRLCK; + break; + case LOCK_UN: + lock.l_type = F_UNLCK; + break; + default: + errno = EINVAL; + return -1; + } + lock.l_whence = SEEK_SET; + lock.l_start = lock.l_len = 0L; + + return fcntl(fd, (operation & LOCK_NB) ? F_SETLK : F_SETLKW, &lock); +} #else int flock(fd, operation) |