diff options
Diffstat (limited to 'src/lib9/open.c')
-rw-r--r-- | src/lib9/open.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/lib9/open.c b/src/lib9/open.c new file mode 100644 index 00000000..bb597e8f --- /dev/null +++ b/src/lib9/open.c @@ -0,0 +1,38 @@ +#include <u.h> +#define NOPLAN9DEFINES +#include <libc.h> + +extern char* _p9translate(char*); + +int +p9open(char *xname, int mode) +{ + char *name; + int cexec, rclose; + int fd, umode; + + umode = mode&3; + cexec = mode&OCEXEC; + rclose = mode&ORCLOSE; + mode &= ~(3|OCEXEC|ORCLOSE); + if(mode&OTRUNC){ + umode |= O_TRUNC; + mode ^= OTRUNC; + } + if(mode){ + werrstr("mode not supported"); + return -1; + } + if((name = _p9translate(xname)) == nil) + return -1; + fd = open(name, umode); + if(fd >= 0){ + if(cexec) + fcntl(fd, F_SETFL, FD_CLOEXEC); + if(rclose) + remove(name); + } + if(name != xname) + free(name); + return fd; +} |