|  | #include <u.h> | 
|  | #include <libc.h> | 
|  |  | 
|  | char *e; | 
|  | ulong mode = 0777L; | 
|  |  | 
|  | void | 
|  | usage(void) | 
|  | { | 
|  | fprint(2, "usage: mkdir [-p] [-m mode] dir...\n"); | 
|  | exits("usage"); | 
|  | } | 
|  |  | 
|  | int | 
|  | makedir(char *s) | 
|  | { | 
|  | int f; | 
|  |  | 
|  | if(access(s, AEXIST) == 0){ | 
|  | fprint(2, "mkdir: %s already exists\n", s); | 
|  | e = "error"; | 
|  | return -1; | 
|  | } | 
|  | f = create(s, OREAD, DMDIR | mode); | 
|  | if(f < 0){ | 
|  | fprint(2, "mkdir: can't create %s: %r\n", s); | 
|  | e = "error"; | 
|  | return -1; | 
|  | } | 
|  | close(f); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | void | 
|  | mkdirp(char *s) | 
|  | { | 
|  | char *p; | 
|  |  | 
|  | for(p=strchr(s+1, '/'); p; p=strchr(p+1, '/')){ | 
|  | *p = 0; | 
|  | if(access(s, AEXIST) != 0 && makedir(s) < 0) | 
|  | return; | 
|  | *p = '/'; | 
|  | } | 
|  | if(access(s, AEXIST) != 0) | 
|  | makedir(s); | 
|  | } | 
|  |  | 
|  |  | 
|  | void | 
|  | main(int argc, char *argv[]) | 
|  | { | 
|  | int i, pflag; | 
|  | char *m; | 
|  |  | 
|  | pflag = 0; | 
|  | ARGBEGIN{ | 
|  | default: | 
|  | usage(); | 
|  | case 'm': | 
|  | m = ARGF(); | 
|  | if(m == nil) | 
|  | usage(); | 
|  | mode = strtoul(m, &m, 8); | 
|  | if(mode > 0777) | 
|  | usage(); | 
|  | break; | 
|  | case 'p': | 
|  | pflag = 1; | 
|  | break; | 
|  | }ARGEND | 
|  |  | 
|  | for(i=0; i<argc; i++){ | 
|  | if(pflag) | 
|  | mkdirp(argv[i]); | 
|  | else | 
|  | makedir(argv[i]); | 
|  | } | 
|  | exits(e); | 
|  | } |