Blob


1 #include <u.h>
2 #include <libc.h>
4 char *e;
5 ulong mode = 0777L;
7 void
8 usage(void)
9 {
10 fprint(2, "usage: mkdir [-p] [-m mode] dir...\n");
11 exits("usage");
12 }
14 int
15 makedir(char *s)
16 {
17 int f;
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 }
34 void
35 mkdirp(char *s)
36 {
37 char *p;
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 }
50 void
51 main(int argc, char *argv[])
52 {
53 int i, pflag;
54 char *m;
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
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 }