1 #include <lib9.h> 2 3 static void 4 usage(void) 5 { 6 fprint(2, "usage: mkdir [-p] dir ...\n"); 7 exits("usage"); 8 } 9 10 static int 11 mkdirp(char *s, int pflag) 12 { 13 char *p; 14 15 if(!pflag) { 16 if(access(s, 0) == 0){ 17 fprint(2, "mkdir: %s already exists\n", s); 18 exits("exists"); 19 } 20 return mkdir(s); 21 } 22 23 /* create intermediate directories */ 24 p = strchr(s+1, '/'); 25 while(p != nil) { 26 *p = '\0'; 27 if(access(s, 0) != 0 && mkdir(s) != 0) 28 return -1; 29 *p = '/'; 30 p = strchr(p+1, '/'); 31 } 32 33 /* create final directory */ 34 if(access(s, 0) == 0) 35 return 0; 36 return mkdir(s); 37 } 38 39 void 40 main(int argc, char **argv) 41 { 42 int pflag; 43 44 pflag = 0; 45 ARGBEGIN{ 46 case 'p': 47 pflag++; 48 break; 49 default: 50 usage(); 51 }ARGEND 52 for(; *argv; argv++){ 53 if(mkdirp(*argv, pflag) < 0){ 54 fprint(2, "mkdir: can't create %s\n", *argv); 55 perror(0); 56 exits("error"); 57 } 58 } 59 exits(0); 60 } 61