| #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); |
| } |