xref: /inferno-os/utils/mkdir/mkdir.c (revision 2b69dba5038ffd0b59cf30a4c44bce549e5097f8)
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