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