mkdir.c - 9base - revived minimalist port of Plan 9 userland to Unix | |
git clone git://git.suckless.org/9base | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
mkdir.c (1026B) | |
--- | |
1 #include <u.h> | |
2 #include <libc.h> | |
3 | |
4 char *e; | |
5 ulong mode = 0777L; | |
6 | |
7 void | |
8 usage(void) | |
9 { | |
10 fprint(2, "usage: mkdir [-p] [-m mode] dir...\n"); | |
11 exits("usage"); | |
12 } | |
13 | |
14 int | |
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 | |
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 | |
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 } |