aboutsummaryrefslogtreecommitdiff
path: root/utils/mkdir
diff options
context:
space:
mode:
authorbhgv <bhgv.empire@gmail.com>2018-03-01 16:54:45 +0200
committerbhgv <bhgv.empire@gmail.com>2018-03-01 16:54:45 +0200
commitb786f20bbab5a59046aa78a2c6c2a11536497202 (patch)
tree0851ecdec889eb9b7ba3751cc04d4f0b474e4a9e /utils/mkdir
inferno-os tree was separated from the inferno-os-android (separated from the Android driver)
Diffstat (limited to 'utils/mkdir')
-rw-r--r--utils/mkdir/mkdir.c60
-rw-r--r--utils/mkdir/mkfile13
2 files changed, 73 insertions, 0 deletions
diff --git a/utils/mkdir/mkdir.c b/utils/mkdir/mkdir.c
new file mode 100644
index 0000000..b47ee54
--- /dev/null
+++ b/utils/mkdir/mkdir.c
@@ -0,0 +1,60 @@
+#include <lib9.h>
+
+static void
+usage(void)
+{
+ fprint(2, "usage: mkdir [-p] dir ...\n");
+ exits("usage");
+}
+
+static int
+mkdirp(char *s, int pflag)
+{
+ char *p;
+
+ if(!pflag) {
+ if(access(s, 0) == 0){
+ fprint(2, "mkdir: %s already exists\n", s);
+ exits("exists");
+ }
+ 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");
+ }
+ }
+ exits(0);
+}
diff --git a/utils/mkdir/mkfile b/utils/mkdir/mkfile
new file mode 100644
index 0000000..af0eb49
--- /dev/null
+++ b/utils/mkdir/mkfile
@@ -0,0 +1,13 @@
+<../../mkconfig
+
+TARG=mkdir
+
+OFILES= mkdir.$O\
+
+HFILES=
+
+LIBS=9
+
+BIN=$ROOT/$OBJDIR/bin
+
+<$ROOT/mkfiles/mkone-$SHELLTYPE