Blame


1 b3994ec5 2003-12-11 devnull #include <u.h>
2 b3994ec5 2003-12-11 devnull #define NOPLAN9DEFINES
3 b3994ec5 2003-12-11 devnull #include <libc.h>
4 b3994ec5 2003-12-11 devnull
5 b3994ec5 2003-12-11 devnull extern char* _p9translate(char*);
6 b3994ec5 2003-12-11 devnull
7 b3994ec5 2003-12-11 devnull int
8 b3994ec5 2003-12-11 devnull p9open(char *xname, int mode)
9 b3994ec5 2003-12-11 devnull {
10 b3994ec5 2003-12-11 devnull char *name;
11 b3994ec5 2003-12-11 devnull int cexec, rclose;
12 b3994ec5 2003-12-11 devnull int fd, umode;
13 b3994ec5 2003-12-11 devnull
14 b3994ec5 2003-12-11 devnull umode = mode&3;
15 b3994ec5 2003-12-11 devnull cexec = mode&OCEXEC;
16 b3994ec5 2003-12-11 devnull rclose = mode&ORCLOSE;
17 b3994ec5 2003-12-11 devnull mode &= ~(3|OCEXEC|ORCLOSE);
18 b3994ec5 2003-12-11 devnull if(mode&OTRUNC){
19 b3994ec5 2003-12-11 devnull umode |= O_TRUNC;
20 b3994ec5 2003-12-11 devnull mode ^= OTRUNC;
21 b3994ec5 2003-12-11 devnull }
22 b3994ec5 2003-12-11 devnull if(mode){
23 b3994ec5 2003-12-11 devnull werrstr("mode not supported");
24 b3994ec5 2003-12-11 devnull return -1;
25 b3994ec5 2003-12-11 devnull }
26 b3994ec5 2003-12-11 devnull if((name = _p9translate(xname)) == nil)
27 b3994ec5 2003-12-11 devnull return -1;
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 if(name != xname)
36 b3994ec5 2003-12-11 devnull free(name);
37 b3994ec5 2003-12-11 devnull return fd;
38 b3994ec5 2003-12-11 devnull }