From e750400529eb4e655e206cbfba42b156a03c29c3 Mon Sep 17 00:00:00 2001 From: rsc Date: Fri, 11 Jun 2004 14:38:56 +0000 Subject: add OLOCK --- src/lib9/create.c | 12 ++++++++++-- src/lib9/open.c | 12 ++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) (limited to 'src/lib9') 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 #define NOPLAN9DEFINES +#include #include #include #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 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 #define NOPLAN9DEFINES +#include #include #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) -- cgit v1.2.3