xref: /plan9/sys/src/cmd/mkdir.c (revision af328e481aa6778cfbb455c2289edd78567cdddb)
13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier 
460726053SDavid du Colombier char *e;
5*af328e48SDavid du Colombier ulong mode = 0777L;
660726053SDavid du Colombier 
760726053SDavid du Colombier void
usage(void)860726053SDavid du Colombier usage(void)
960726053SDavid du Colombier {
10*af328e48SDavid du Colombier 	fprint(2, "usage: mkdir [-p] [-m mode] dir...\n");
1160726053SDavid du Colombier 	exits("usage");
1260726053SDavid du Colombier }
1360726053SDavid du Colombier 
1460726053SDavid du Colombier int
makedir(char * s)1560726053SDavid du Colombier makedir(char *s)
1660726053SDavid du Colombier {
1760726053SDavid du Colombier 	int f;
1860726053SDavid du Colombier 
1960726053SDavid du Colombier 	if(access(s, AEXIST) == 0){
2060726053SDavid du Colombier 		fprint(2, "mkdir: %s already exists\n", s);
2160726053SDavid du Colombier 		e = "error";
2260726053SDavid du Colombier 		return -1;
2360726053SDavid du Colombier 	}
24*af328e48SDavid du Colombier 	f = create(s, OREAD, DMDIR | mode);
2560726053SDavid du Colombier 	if(f < 0){
2660726053SDavid du Colombier 		fprint(2, "mkdir: can't create %s: %r\n", s);
2760726053SDavid du Colombier 		e = "error";
2860726053SDavid du Colombier 		return -1;
2960726053SDavid du Colombier 	}
3060726053SDavid du Colombier 	close(f);
3160726053SDavid du Colombier 	return 0;
3260726053SDavid du Colombier }
3360726053SDavid du Colombier 
3460726053SDavid du Colombier void
mkdirp(char * s)3560726053SDavid du Colombier mkdirp(char *s)
3660726053SDavid du Colombier {
3760726053SDavid du Colombier 	char *p;
3860726053SDavid du Colombier 
3960726053SDavid du Colombier 	for(p=strchr(s+1, '/'); p; p=strchr(p+1, '/')){
4060726053SDavid du Colombier 		*p = 0;
4160726053SDavid du Colombier 		if(access(s, AEXIST) != 0 && makedir(s) < 0)
4260726053SDavid du Colombier 			return;
4360726053SDavid du Colombier 		*p = '/';
4460726053SDavid du Colombier 	}
4560726053SDavid du Colombier 	if(access(s, AEXIST) != 0)
4660726053SDavid du Colombier 		makedir(s);
4760726053SDavid du Colombier }
4860726053SDavid du Colombier 
4960726053SDavid du Colombier 
503e12c5d1SDavid du Colombier void
main(int argc,char * argv[])513e12c5d1SDavid du Colombier main(int argc, char *argv[])
523e12c5d1SDavid du Colombier {
5360726053SDavid du Colombier 	int i, pflag;
54*af328e48SDavid du Colombier 	char *m;
553e12c5d1SDavid du Colombier 
5660726053SDavid du Colombier 	pflag = 0;
5760726053SDavid du Colombier 	ARGBEGIN{
5860726053SDavid du Colombier 	default:
5960726053SDavid du Colombier 		usage();
60*af328e48SDavid du Colombier 	case 'm':
61*af328e48SDavid du Colombier 		m = ARGF();
62*af328e48SDavid du Colombier 		if(m == nil)
63*af328e48SDavid du Colombier 			usage();
64*af328e48SDavid du Colombier 		mode = strtoul(m, &m, 8);
65*af328e48SDavid du Colombier 		if(mode > 0777)
66*af328e48SDavid du Colombier 			usage();
67*af328e48SDavid du Colombier 		break;
6860726053SDavid du Colombier 	case 'p':
6960726053SDavid du Colombier 		pflag = 1;
7060726053SDavid du Colombier 		break;
7160726053SDavid du Colombier 	}ARGEND
7260726053SDavid du Colombier 
7360726053SDavid du Colombier 	for(i=0; i<argc; i++){
7460726053SDavid du Colombier 		if(pflag)
7560726053SDavid du Colombier 			mkdirp(argv[i]);
7660726053SDavid du Colombier 		else
7760726053SDavid du Colombier 			makedir(argv[i]);
783e12c5d1SDavid du Colombier 	}
797dd7cddfSDavid du Colombier 	exits(e);
803e12c5d1SDavid du Colombier }
81