add OLOCK
diff --git a/src/lib9/create.c b/src/lib9/create.c index 6bfb0c1..a9e796a 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 @@ } 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)
diff --git a/src/lib9/open.c b/src/lib9/open.c index 9d9ba31..5b4935c 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 @@ 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 @@ } 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)