xref: /inferno-os/appl/cmd/mkdir.b (revision 3f1f06c5d12b24c4061e5123acabf72348ff45a2)
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