diff options
author | rsc <devnull@localhost> | 2004-06-11 14:38:56 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2004-06-11 14:38:56 +0000 |
commit | e750400529eb4e655e206cbfba42b156a03c29c3 (patch) | |
tree | e3b925bbaa38adec1d915d29b01d4f672c337c65 /src/lib9/open.c | |
parent | d2ffec702ecc02ddb00700b713865a7868d9805b (diff) | |
download | plan9port-e750400529eb4e655e206cbfba42b156a03c29c3.tar.gz plan9port-e750400529eb4e655e206cbfba42b156a03c29c3.tar.bz2 plan9port-e750400529eb4e655e206cbfba42b156a03c29c3.zip |
add OLOCK
Diffstat (limited to 'src/lib9/open.c')
-rw-r--r-- | src/lib9/open.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/src/lib9/open.c b/src/lib9/open.c index 9d9ba310..5b4935c1 100644 --- a/src/lib9/open.c +++ b/src/lib9/open.c @@ -1,6 +1,7 @@ #define _GNU_SOURCE /* for Linux O_DIRECT */ #include <u.h> #define NOPLAN9DEFINES +#include <sys/file.h> #include <libc.h> #ifndef O_DIRECT #define O_DIRECT 0 @@ -10,12 +11,13 @@ int p9open(char *name, int mode) { int cexec, rclose; - int fd, umode; + int fd, umode, lock; umode = mode&3; cexec = mode&OCEXEC; rclose = mode&ORCLOSE; - mode &= ~(3|OCEXEC|ORCLOSE); + lock = mode&OLOCK; + mode &= ~(3|OCEXEC|ORCLOSE|OLOCK); if(mode&OTRUNC){ umode |= O_TRUNC; mode ^= OTRUNC; @@ -30,6 +32,12 @@ p9open(char *name, int mode) } fd = open(name, umode); if(fd >= 0){ + if(lock){ + if(flock(fd, (mode==OREAD) ? LOCK_SH : LOCK_EX) < 0){ + close(fd); + return -1; + } + } if(cexec) fcntl(fd, F_SETFL, FD_CLOEXEC); if(rclose) |