9base

revived minimalist port of Plan 9 userland to Unix
git clone git://git.suckless.org/9base
Log | Files | Refs | README | LICENSE

mkdir.c (1026B)


      1 #include <u.h>
      2 #include <libc.h>
      3 
      4 char *e;
      5 ulong mode = 0777L;
      6 
      7 void
      8 usage(void)
      9 {
     10 	fprint(2, "usage: mkdir [-p] [-m mode] dir...\n");
     11 	exits("usage");
     12 }
     13 
     14 int
     15 makedir(char *s)
     16 {
     17 	int f;
     18 
     19 	if(access(s, AEXIST) == 0){
     20 		fprint(2, "mkdir: %s already exists\n", s);
     21 		e = "error";
     22 		return -1;
     23 	}
     24 	f = create(s, OREAD, DMDIR | mode);
     25 	if(f < 0){
     26 		fprint(2, "mkdir: can't create %s: %r\n", s);
     27 		e = "error";
     28 		return -1;
     29 	}
     30 	close(f);
     31 	return 0;
     32 }
     33 
     34 void
     35 mkdirp(char *s)
     36 {
     37 	char *p;
     38 
     39 	for(p=strchr(s+1, '/'); p; p=strchr(p+1, '/')){
     40 		*p = 0;
     41 		if(access(s, AEXIST) != 0 && makedir(s) < 0)
     42 			return;
     43 		*p = '/';
     44 	}
     45 	if(access(s, AEXIST) != 0)
     46 		makedir(s);
     47 }
     48 
     49 
     50 void
     51 main(int argc, char *argv[])
     52 {
     53 	int i, pflag;
     54 	char *m;
     55 
     56 	pflag = 0;
     57 	ARGBEGIN{
     58 	default:
     59 		usage();
     60 	case 'm':
     61 		m = ARGF();
     62 		if(m == nil)
     63 			usage();
     64 		mode = strtoul(m, &m, 8);
     65 		if(mode > 0777)
     66 			usage();
     67 		break;
     68 	case 'p':
     69 		pflag = 1;
     70 		break;
     71 	}ARGEND
     72 
     73 	for(i=0; i<argc; i++){
     74 		if(pflag)
     75 			mkdirp(argv[i]);
     76 		else
     77 			makedir(argv[i]);
     78 	}
     79 	exits(e);
     80 }