plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

commit e750400529eb4e655e206cbfba42b156a03c29c3
parent d2ffec702ecc02ddb00700b713865a7868d9805b
Author: rsc <devnull@localhost>
Date:   Fri, 11 Jun 2004 14:38:56 +0000

add OLOCK

Diffstat:
Msrc/lib9/create.c | 12++++++++++--
Msrc/lib9/open.c | 12++++++++++--
2 files changed, 20 insertions(+), 4 deletions(-)

diff --git 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) diff --git 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)