summaryrefslogtreecommitdiff
path: root/utils/mkdir/mkdir.c
diff options
context:
space:
mode:
authorforsyth <forsyth@vitanuova.com>2011-03-29 13:46:20 +0100
committerforsyth <forsyth@vitanuova.com>2011-03-29 13:46:20 +0100
commitd850935a944d6b7390dc1e3350c70dd438f6777a (patch)
tree136ab6ce631fcc68009d450d6b048baf44d2741d /utils/mkdir/mkdir.c
parent3b69204dd2d2caeb9beec2584abbf2990789155a (diff)
20110329-1346
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");