Blame


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