Blob
1 #include <u.h>2 #include <libc.h>4 char *e;5 ulong mode = 0777L;7 void8 usage(void)9 {10 fprint(2, "usage: mkdir [-p] [-m mode] dir...\n");11 exits("usage");12 }14 int15 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 void35 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 void51 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 }ARGEND73 for(i=0; i<argc; i++){74 if(pflag)75 mkdirp(argv[i]);76 else77 makedir(argv[i]);78 }79 exits(e);80 }