Make mkdir -m work
authorEric Andersen <andersen@codepoet.org>
Fri, 22 Oct 1999 18:18:31 +0000 (18:18 -0000)
committerEric Andersen <andersen@codepoet.org>
Fri, 22 Oct 1999 18:18:31 +0000 (18:18 -0000)
Changelog
chmod_chown_chgrp.c
coreutils/mkdir.c
mkdir.c
utility.c

index 8948f79851684b7482de446d281d362032f0fe78..ab113a644ec02d7ada04ba3aa7a7f3595b50f59b 100644 (file)
--- a/Changelog
+++ b/Changelog
@@ -1,3 +1,6 @@
+0.32
+       * Fixed mkdir -m option so that it works.
+
 0.31
        * I added a changelog for version 0.30. 
        * adjusted find internals to make it smaller, and removed 
index 8bda06861b7ff4096203270ade5aea16db9ca72b..a91b0a365e8e6e63569d8df63b428103e8702dd7 100644 (file)
@@ -101,7 +101,7 @@ int chmod_chown_chgrp_main(int argc, char **argv)
     
     if ( whichApp == CHMOD_APP ) {
        /* Find the specified modes */
-       mode &= S_ISVTX|S_ISUID|S_ISGID|S_IRWXU|S_IRWXG|S_IRWXO;
+       mode = ( 0 & (S_ISVTX|S_ISUID|S_ISGID|S_IRWXU|S_IRWXG|S_IRWXO));
        if ( parse_mode(*argv, &mode) == FALSE ) {
            fprintf(stderr, "%s: Unknown mode: %s\n", invocationName, *argv);
            exit( FALSE);
index 98c8d8f089245147113b618aca68aa571870df54..0d0a90ec3d714dc0d4664f2bd776778a2c1175cb 100644 (file)
@@ -33,21 +33,32 @@ static const char mkdir_usage[] = "Usage: mkdir [OPTION] DIRECTORY...\n"
 
 
 static int parentFlag = FALSE;
-static int permFlag = FALSE;
-static mode_t mode = 0777;
+static mode_t mode = 777;
 
 
 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;
@@ -55,6 +66,7 @@ extern int mkdir_main(int argc, char **argv)
            default:
                usage( mkdir_usage);
            }
+       }
        argc--;
        argv++;
     }
@@ -64,11 +76,13 @@ 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) {
+       status=stat(*argv, &statBuf);
+       if (status != -1 && status != ENOENT ) {
            fprintf(stderr, "%s: File exists\n", *argv);
-           return( FALSE);
+           exit( FALSE);
        }
        if (parentFlag == TRUE)
            createPath(*argv, mode);
@@ -78,6 +92,8 @@ extern int mkdir_main(int argc, char **argv)
                exit( FALSE);
            }
        }
+       argc--;
+       argv++;
     }
     exit( TRUE);
 }
diff --git a/mkdir.c b/mkdir.c
index 98c8d8f089245147113b618aca68aa571870df54..0d0a90ec3d714dc0d4664f2bd776778a2c1175cb 100644 (file)
--- a/mkdir.c
+++ b/mkdir.c
@@ -33,21 +33,32 @@ static const char mkdir_usage[] = "Usage: mkdir [OPTION] DIRECTORY...\n"
 
 
 static int parentFlag = FALSE;
-static int permFlag = FALSE;
-static mode_t mode = 0777;
+static mode_t mode = 777;
 
 
 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;
@@ -55,6 +66,7 @@ extern int mkdir_main(int argc, char **argv)
            default:
                usage( mkdir_usage);
            }
+       }
        argc--;
        argv++;
     }
@@ -64,11 +76,13 @@ 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) {
+       status=stat(*argv, &statBuf);
+       if (status != -1 && status != ENOENT ) {
            fprintf(stderr, "%s: File exists\n", *argv);
-           return( FALSE);
+           exit( FALSE);
        }
        if (parentFlag == TRUE)
            createPath(*argv, mode);
@@ -78,6 +92,8 @@ extern int mkdir_main(int argc, char **argv)
                exit( FALSE);
            }
        }
+       argc--;
+       argv++;
     }
     exit( TRUE);
 }
index a653bb32538a526a74e122713abf8a48575c37ac..421492dca429d04a14a4bf5b34b3c65c0a92bbd8 100644 (file)
--- a/utility.c
+++ b/utility.c
@@ -540,11 +540,9 @@ parse_mode( const char* s, mode_t* theMode)
                                        groups |= S_ISUID|S_ISGID|S_IRWXU|S_IRWXG|S_IRWXO;
                                break;
                        default:
-                               if ( isdigit(c) && c >= '0' && c <= '7' && mode == 0 && groups == 0 ) {
-                                       andMode = 0;
-                                       orMode = strtol(--s, NULL, 8);
-                                       *theMode &= andMode;
-                                       *theMode |= orMode;
+                               if ( isdigit(c) && c >= '0' && c <= '7' && 
+                                               mode == 0 && groups == 0 ) {
+                                       *theMode = strtol(--s, NULL, 8);
                                        return (TRUE);
                                }
                                else