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