aboutsummaryrefslogtreecommitdiff
path: root/src/lib9/create.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2004-06-11 14:38:56 +0000
committerrsc <devnull@localhost>2004-06-11 14:38:56 +0000
commite750400529eb4e655e206cbfba42b156a03c29c3 (patch)
treee3b925bbaa38adec1d915d29b01d4f672c337c65 /src/lib9/create.c
parentd2ffec702ecc02ddb00700b713865a7868d9805b (diff)
downloadplan9port-e750400529eb4e655e206cbfba42b156a03c29c3.tar.gz
plan9port-e750400529eb4e655e206cbfba42b156a03c29c3.tar.bz2
plan9port-e750400529eb4e655e206cbfba42b156a03c29c3.zip
add OLOCK
Diffstat (limited to 'src/lib9/create.c')
-rw-r--r--src/lib9/create.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/lib9/create.c b/src/lib9/create.c
index 6bfb0c1b..a9e796ad 100644
--- a/src/lib9/create.c
+++ b/src/lib9/create.c
@@ -1,6 +1,7 @@
#define _GNU_SOURCE /* for Linux O_DIRECT */
#include <u.h>
#define NOPLAN9DEFINES
+#include <sys/file.h>
#include <libc.h>
#include <sys/stat.h>
#ifndef O_DIRECT
@@ -10,11 +11,12 @@
int
p9create(char *path, int mode, ulong perm)
{
- int fd, cexec, umode, rclose;
+ int fd, cexec, umode, rclose, lock;
+ lock = mode&OLOCK;
cexec = mode&OCEXEC;
rclose = mode&ORCLOSE;
- mode &= ~(ORCLOSE|OCEXEC);
+ mode &= ~(ORCLOSE|OCEXEC|OLOCK);
/* XXX should get mode mask right? */
fd = -1;
@@ -45,6 +47,12 @@ p9create(char *path, int mode, ulong perm)
}
out:
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)