summaryrefslogtreecommitdiff
path: root/utils/mkdir/mkdir.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/mkdir/mkdir.c')
-rw-r--r--utils/mkdir/mkdir.c54
1 files changed, 48 insertions, 6 deletions
diff --git a/utils/mkdir/mkdir.c b/utils/mkdir/mkdir.c
index 5bdf53c0..b47ee54d 100644
--- a/utils/mkdir/mkdir.c
+++ b/utils/mkdir/mkdir.c
@@ -1,14 +1,56 @@
#include <lib9.h>
-void
-main(int argc, char **argv)
+static void
+usage(void)
+{
+ fprint(2, "usage: mkdir [-p] dir ...\n");
+ exits("usage");
+}
+
+static int
+mkdirp(char *s, int pflag)
{
- for(argv++; *argv; argv++){
- if(access(*argv, 0) == 0){
- fprint(2, "mkdir: %s already exists\n", *argv);
+ char *p;
+
+ if(!pflag) {
+ if(access(s, 0) == 0){
+ fprint(2, "mkdir: %s already exists\n", s);
exits("exists");
}
- if(mkdir(*argv) < 0){
+ return mkdir(s);
+ }
+
+ /* create intermediate directories */
+ p = strchr(s+1, '/');
+ while(p != nil) {
+ *p = '\0';
+ if(access(s, 0) != 0 && mkdir(s) != 0)
+ return -1;
+ *p = '/';
+ p = strchr(p+1, '/');
+ }
+
+ /* create final directory */
+ if(access(s, 0) == 0)
+ return 0;
+ return mkdir(s);
+}
+
+void
+main(int argc, char **argv)
+{
+ int pflag;
+
+ pflag = 0;
+ ARGBEGIN{
+ case 'p':
+ pflag++;
+ break;
+ default:
+ usage();
+ }ARGEND
+ for(; *argv; argv++){
+ if(mkdirp(*argv, pflag) < 0){
fprint(2, "mkdir: can't create %s\n", *argv);
perror(0);
exits("error");