Blame


1 be36ff68 2004-04-29 devnull #define _GNU_SOURCE /* for Linux O_DIRECT */
2 b3994ec5 2003-12-11 devnull #include <u.h>
3 b3994ec5 2003-12-11 devnull #define NOPLAN9DEFINES
4 b3994ec5 2003-12-11 devnull #include <libc.h>
5 b3994ec5 2003-12-11 devnull
6 b3994ec5 2003-12-11 devnull int
7 8ad51794 2004-03-25 devnull p9open(char *name, int mode)
8 b3994ec5 2003-12-11 devnull {
9 b3994ec5 2003-12-11 devnull int cexec, rclose;
10 b3994ec5 2003-12-11 devnull int fd, umode;
11 b3994ec5 2003-12-11 devnull
12 b3994ec5 2003-12-11 devnull umode = mode&3;
13 b3994ec5 2003-12-11 devnull cexec = mode&OCEXEC;
14 b3994ec5 2003-12-11 devnull rclose = mode&ORCLOSE;
15 b3994ec5 2003-12-11 devnull mode &= ~(3|OCEXEC|ORCLOSE);
16 b3994ec5 2003-12-11 devnull if(mode&OTRUNC){
17 b3994ec5 2003-12-11 devnull umode |= O_TRUNC;
18 b3994ec5 2003-12-11 devnull mode ^= OTRUNC;
19 b3994ec5 2003-12-11 devnull }
20 be36ff68 2004-04-29 devnull if(mode&ODIRECT){
21 be36ff68 2004-04-29 devnull umode |= O_DIRECT;
22 be36ff68 2004-04-29 devnull mode ^= ODIRECT;
23 be36ff68 2004-04-29 devnull }
24 b3994ec5 2003-12-11 devnull if(mode){
25 b3994ec5 2003-12-11 devnull werrstr("mode not supported");
26 b3994ec5 2003-12-11 devnull return -1;
27 b3994ec5 2003-12-11 devnull }
28 b3994ec5 2003-12-11 devnull fd = open(name, umode);
29 b3994ec5 2003-12-11 devnull if(fd >= 0){
30 b3994ec5 2003-12-11 devnull if(cexec)
31 b3994ec5 2003-12-11 devnull fcntl(fd, F_SETFL, FD_CLOEXEC);
32 b3994ec5 2003-12-11 devnull if(rclose)
33 b3994ec5 2003-12-11 devnull remove(name);
34 b3994ec5 2003-12-11 devnull }
35 b3994ec5 2003-12-11 devnull return fd;
36 b3994ec5 2003-12-11 devnull }