xref: /inferno-os/lib9/create.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsyth #include "lib9.h"
2*37da2899SCharles.Forsyth #include <sys/types.h>
3*37da2899SCharles.Forsyth #include <fcntl.h>
4*37da2899SCharles.Forsyth 
5*37da2899SCharles.Forsyth int
create(char * f,int mode,int perm)6*37da2899SCharles.Forsyth create(char *f, int mode, int perm)
7*37da2899SCharles.Forsyth {
8*37da2899SCharles.Forsyth 	int m;
9*37da2899SCharles.Forsyth 
10*37da2899SCharles.Forsyth 	m = 0;
11*37da2899SCharles.Forsyth 	switch(mode & 3){
12*37da2899SCharles.Forsyth 	case OREAD:
13*37da2899SCharles.Forsyth 	case OEXEC:
14*37da2899SCharles.Forsyth 		m = O_RDONLY;
15*37da2899SCharles.Forsyth 		break;
16*37da2899SCharles.Forsyth 	case OWRITE:
17*37da2899SCharles.Forsyth 		m = O_WRONLY;
18*37da2899SCharles.Forsyth 		break;
19*37da2899SCharles.Forsyth 	case ORDWR:
20*37da2899SCharles.Forsyth 		m = O_RDWR;
21*37da2899SCharles.Forsyth 		break;
22*37da2899SCharles.Forsyth 	}
23*37da2899SCharles.Forsyth 	m |= O_CREAT|O_TRUNC;
24*37da2899SCharles.Forsyth 
25*37da2899SCharles.Forsyth 	if(perm & DMDIR){
26*37da2899SCharles.Forsyth 		if(mkdir(f, perm&0777) < 0)
27*37da2899SCharles.Forsyth 			return -1;
28*37da2899SCharles.Forsyth 		perm &= ~DMDIR;
29*37da2899SCharles.Forsyth 		m &= 3;
30*37da2899SCharles.Forsyth 	}
31*37da2899SCharles.Forsyth 	return open(f, m, perm);
32*37da2899SCharles.Forsyth }
33