diff options
| author | forsyth <forsyth@vitanuova.com> | 2011-03-29 13:46:20 +0100 |
|---|---|---|
| committer | forsyth <forsyth@vitanuova.com> | 2011-03-29 13:46:20 +0100 |
| commit | d850935a944d6b7390dc1e3350c70dd438f6777a (patch) | |
| tree | 136ab6ce631fcc68009d450d6b048baf44d2741d | |
| parent | 3b69204dd2d2caeb9beec2584abbf2990789155a (diff) | |
20110329-1346
| -rw-r--r-- | CHANGES | 1 | ||||
| -rw-r--r-- | utils/mkdir/mkdir.c | 54 |
2 files changed, 49 insertions, 6 deletions
@@ -1,4 +1,5 @@ 20110329 + utils/mkdir/mkdir.c - add -p option [mechiel, issue 250] emu/Linux/mkfile - try searching -lpthread after -lrt for sem_* [issue 247] emu/port/devfs-posix.c - treat unix domain sockets as files (open/read/write/close) [npe, rsc, issue 254] emu/port/devfs-posix.c - use volatile correctly; slight code tidy 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"); |
