xref: /plan9/sys/src/cmd/mkdir.c (revision af328e481aa6778cfbb455c2289edd78567cdddb)
1 #include <u.h>
2 #include <libc.h>
3 
4 char *e;
5 ulong mode = 0777L;
6 
7 void
usage(void)8 usage(void)
9 {
10 	fprint(2, "usage: mkdir [-p] [-m mode] dir...\n");
11 	exits("usage");
12 }
13 
14 int
makedir(char * s)15 makedir(char *s)
16 {
17 	int f;
18 
19 	if(access(s, AEXIST) == 0){
20 		fprint(2, "mkdir: %s already exists\n", s);
21 		e = "error";
22 		return -1;
23 	}
24 	f = create(s, OREAD, DMDIR | mode);
25 	if(f < 0){
26 		fprint(2, "mkdir: can't create %s: %r\n", s);
27 		e = "error";
28 		return -1;
29 	}
30 	close(f);
31 	return 0;
32 }
33 
34 void
mkdirp(char * s)35 mkdirp(char *s)
36 {
37 	char *p;
38 
39 	for(p=strchr(s+1, '/'); p; p=strchr(p+1, '/')){
40 		*p = 0;
41 		if(access(s, AEXIST) != 0 && makedir(s) < 0)
42 			return;
43 		*p = '/';
44 	}
45 	if(access(s, AEXIST) != 0)
46 		makedir(s);
47 }
48 
49 
50 void
main(int argc,char * argv[])51 main(int argc, char *argv[])
52 {
53 	int i, pflag;
54 	char *m;
55 
56 	pflag = 0;
57 	ARGBEGIN{
58 	default:
59 		usage();
60 	case 'm':
61 		m = ARGF();
62 		if(m == nil)
63 			usage();
64 		mode = strtoul(m, &m, 8);
65 		if(mode > 0777)
66 			usage();
67 		break;
68 	case 'p':
69 		pflag = 1;
70 		break;
71 	}ARGEND
72 
73 	for(i=0; i<argc; i++){
74 		if(pflag)
75 			mkdirp(argv[i]);
76 		else
77 			makedir(argv[i]);
78 	}
79 	exits(e);
80 }
81