implemented numeric sort (sort -g)
[oweals/busybox.git] / mkdir.c
diff --git a/mkdir.c b/mkdir.c
index b42899a4a890180a16eeb901f4f6ec3b2e12a25b..9ea3b4ea0905d96e8e8c3721e6ee8f26631c68b8 100644 (file)
--- a/mkdir.c
+++ b/mkdir.c
@@ -1,7 +1,9 @@
 /*
  * Mini mkdir implementation for busybox
  *
- * Copyright (C) 1998 by Erik Andersen <andersee@debian.org>
+ *
+ * Copyright (C) 1999 by Lineo, inc.
+ * Written by Erik Andersen <andersen@lineo.com>, <andersee@debian.org>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 #include <errno.h>
 #include <sys/param.h>
 
-const char mkdir_usage[] = "Usage: mkdir [OPTION] DIRECTORY...\n"
+static const char mkdir_usage[] = "Usage: mkdir [OPTION] DIRECTORY...\n\n"
 "Create the DIRECTORY(ies), if they do not already exist\n\n"
-"-m\tset permission mode (as in chmod), not rwxrwxrwx - umask\n"
-"-p\tno error if existing, make parent directories as needed\n";
+"Options:\n"
+"\t-m\tset permission mode (as in chmod), not rwxrwxrwx - umask\n"
+"\t-p\tno error if existing, make parent directories as needed\n";
 
 
 static int parentFlag = FALSE;
-static int permFlag = FALSE;
 static mode_t mode = 0777;
 
 
 extern int mkdir_main(int argc, char **argv)
 {
+    int i=FALSE;
     argc--;
     argv++;
 
     /* Parse any options */
-    while (argc > 1 && **argv == '-') {
-       while (*++(*argv))
+    while (argc > 0 && **argv == '-') {
+       while (i==FALSE && *++(*argv)) {
            switch (**argv) {
            case 'm':
-               permFlag = TRUE;
+               if (--argc == 0)
+                   usage( mkdir_usage);
+               /* Find the specified modes */
+               mode = 0;
+               if ( parse_mode(*(++argv), &mode) == FALSE ) {
+                   fprintf(stderr, "Unknown mode: %s\n", *argv);
+                   exit( FALSE);
+               }
+               /* Set the umask for this process so it doesn't 
+                * screw up whatever the user just entered. */
+               umask(0);
+               i=TRUE;
                break;
            case 'p':
                parentFlag = TRUE;
@@ -53,6 +67,7 @@ extern int mkdir_main(int argc, char **argv)
            default:
                usage( mkdir_usage);
            }
+       }
        argc--;
        argv++;
     }
@@ -62,20 +77,29 @@ extern int mkdir_main(int argc, char **argv)
        usage( mkdir_usage);
     }
 
-    while (--argc > 0) {
+    while (argc > 0) {
+       int status;
        struct stat statBuf;
-       if (stat(*(++argv), &statBuf) != ENOENT) {
-           fprintf(stderr, "%s: File exists\n", *argv);
-           return( FALSE);
+       char buf[NAME_MAX];
+
+       strcpy (buf, *argv);
+       status=stat(buf, &statBuf);
+       if (status != -1 && status != ENOENT ) {
+           fprintf(stderr, "%s: File exists\n", buf);
+           exit( FALSE);
+       }
+       if (parentFlag == TRUE) {
+           strcat( buf, "/");
+           createPath(buf, mode);
        }
-       if (parentFlag == TRUE)
-           createPath(*argv, mode);
        else { 
-           if (mkdir (*argv, mode) != 0) {
-               perror(*argv);
+           if (mkdir (buf, mode) != 0) {
+               perror(buf);
                exit( FALSE);
            }
        }
+       argc--;
+       argv++;
     }
     exit( TRUE);
 }