URI: 
       tadd OLOCK - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit e750400529eb4e655e206cbfba42b156a03c29c3
   DIR parent d2ffec702ecc02ddb00700b713865a7868d9805b
  HTML Author: rsc <devnull@localhost>
       Date:   Fri, 11 Jun 2004 14:38:56 +0000
       
       add OLOCK
       
       Diffstat:
         M src/lib9/create.c                   |      12 ++++++++++--
         M src/lib9/open.c                     |      12 ++++++++++--
       
       2 files changed, 20 insertions(+), 4 deletions(-)
       ---
   DIR diff --git a/src/lib9/create.c b/src/lib9/create.c
       t@@ -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
       t@@ -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;
       t@@ -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)
   DIR diff --git a/src/lib9/open.c b/src/lib9/open.c
       t@@ -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
       t@@ -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;
       t@@ -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)