Commit Diff


commit - 558ba8f4df93cb7f0a4b1ea88dd93b3828da5a2f
commit + aeb54c0efed03187235820c73b7feef2260951cf
blob - 5bfa67735a08d26d1f5ed4952ae4bb3e4cd26c23
blob + 11421d97d441bf4e3bf46624673bcea3f8726e63
--- src/cmd/mkdir.C
+++ src/cmd/mkdir.C
@@ -1,26 +1,70 @@
 #include <u.h>
 #include <libc.h>
 
+char *e;
+
 void
+usage(void)
+{
+	fprint(2, "usage: mkdir [-p] dir...\n");
+	exits("usage");
+}
+
+int
+makedir(char *s)
+{
+	int f;
+
+	if(access(s, AEXIST) == 0){
+		fprint(2, "mkdir: %s already exists\n", s);
+		e = "error";
+		return -1;
+	}
+	f = create(s, OREAD, DMDIR | 0777L);
+	if(f < 0){
+		fprint(2, "mkdir: can't create %s: %r\n", s);
+		e = "error";
+		return -1;
+	}
+	close(f);
+	return 0;
+}
+
+void
+mkdirp(char *s)
+{
+	char *p;
+
+	for(p=strchr(s+1, '/'); p; p=strchr(p+1, '/')){
+		*p = 0;
+		if(access(s, AEXIST) != 0 && makedir(s) < 0)
+			return;
+		*p = '/';
+	}
+	if(access(s, AEXIST) != 0)
+		makedir(s);
+}
+
+
+void
 main(int argc, char *argv[])
 {
-	int i, f;
-	char *e;
+	int i, pflag;
 
-	e = nil;
-	for(i=1; i<argc; i++){
-		if(access(argv[i], 0) == AEXIST){
-			fprint(2, "mkdir: %s already exists\n", argv[i]);
-			e = "error";
-			continue;
-		}
-		f = create(argv[i], OREAD, DMDIR | 0777L);
-		if(f < 0){
-			fprint(2, "mkdir: can't create %s: %r\n", argv[i]);
-			e = "error";
-			continue;
-		}
-		close(f);
+	pflag = 0;
+	ARGBEGIN{
+	default:
+		usage();
+	case 'p':
+		pflag = 1;
+		break;
+	}ARGEND
+
+	for(i=0; i<argc; i++){
+		if(pflag)
+			mkdirp(argv[i]);
+		else
+			makedir(argv[i]);
 	}
 	exits(e);
 }