ref: cbe4b116989c0bfec49b9ae7a1d9a85ead6648ae
dir: /sys/src/cmd/mkdir.c/
#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); }