1implement Mkdir; 2 3include "sys.m"; 4 sys: Sys; 5 6include "draw.m"; 7 8 9stderr: ref Sys->FD; 10 11Mkdir: module 12{ 13 init: fn(ctxt: ref Draw->Context, argv: list of string); 14}; 15 16init(nil: ref Draw->Context, argv: list of string) 17{ 18 sys = load Sys Sys->PATH; 19 stderr = sys->fildes(2); 20 21 if(argv == nil || (argv = tl argv) == nil) 22 exit; 23 pflag := 0; 24 if(hd argv == "-p"){ 25 pflag = 1; 26 argv = tl argv; 27 } 28 e := ""; 29 for(; argv != nil; argv = tl argv){ 30 dir := hd argv; 31 if(!pflag){ 32 (ok, nil) := sys->stat(dir); 33 if(ok < 0){ 34 if(mkdir(dir) < 0) 35 e = "error"; 36 }else{ 37 sys->fprint(stderr, "mkdir: %s already exists\n", dir); 38 e = "error"; 39 } 40 }else if(mkpath(dir) < 0) 41 e = "error"; 42 } 43 if(e != nil) 44 raise "fail:"+e; 45} 46 47mkpath(dir: string): int 48{ 49 (nil, flds) := sys->tokenize(dir, "/"); 50 s := ""; 51 if(dir != "" && dir[0] != '/') 52 s = "."; 53 for(; flds != nil; flds = tl flds){ 54 s += "/"+hd flds; 55 (ok, d) := sys->stat(s); 56 if(ok < 0){ 57 if(mkdir(s) < 0) 58 return -1; 59 }else if((d.mode & Sys->DMDIR) == 0){ 60 sys->fprint(stderr, "mkdir: can't create %s: %s not a directory\n", dir, s); 61 return -1; 62 } 63 } 64 return 0; 65} 66 67mkdir(dir: string): int 68{ 69 f := sys->create(dir, Sys->OREAD, Sys->DMDIR + 8r777); 70 if(f == nil) { 71 sys->fprint(stderr, "mkdir: can't create %s: %r\n", dir); 72 return -1; 73 } 74 return 0; 75} 76