diff options
author | Eric Andersen <andersen@codepoet.org> | 1999-10-22 18:18:31 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 1999-10-22 18:18:31 +0000 |
commit | fa0540fb091625499b90285bafa061c665e0c636 (patch) | |
tree | b0a130e8b224f980f1ea234c0d1d47590ebe748c | |
parent | 8eefd021ca7a0b14e46e6bbff2d885ca9da0ea96 (diff) | |
download | busybox-w32-fa0540fb091625499b90285bafa061c665e0c636.tar.gz busybox-w32-fa0540fb091625499b90285bafa061c665e0c636.tar.bz2 busybox-w32-fa0540fb091625499b90285bafa061c665e0c636.zip |
Make mkdir -m work
-rw-r--r-- | Changelog | 3 | ||||
-rw-r--r-- | chmod_chown_chgrp.c | 2 | ||||
-rw-r--r-- | coreutils/mkdir.c | 32 | ||||
-rw-r--r-- | mkdir.c | 32 | ||||
-rw-r--r-- | utility.c | 8 |
5 files changed, 55 insertions, 22 deletions
@@ -1,3 +1,6 @@ | |||
1 | 0.32 | ||
2 | * Fixed mkdir -m option so that it works. | ||
3 | |||
1 | 0.31 | 4 | 0.31 |
2 | * I added a changelog for version 0.30. | 5 | * I added a changelog for version 0.30. |
3 | * adjusted find internals to make it smaller, and removed | 6 | * adjusted find internals to make it smaller, and removed |
diff --git a/chmod_chown_chgrp.c b/chmod_chown_chgrp.c index 8bda06861..a91b0a365 100644 --- a/chmod_chown_chgrp.c +++ b/chmod_chown_chgrp.c | |||
@@ -101,7 +101,7 @@ int chmod_chown_chgrp_main(int argc, char **argv) | |||
101 | 101 | ||
102 | if ( whichApp == CHMOD_APP ) { | 102 | if ( whichApp == CHMOD_APP ) { |
103 | /* Find the specified modes */ | 103 | /* Find the specified modes */ |
104 | mode &= S_ISVTX|S_ISUID|S_ISGID|S_IRWXU|S_IRWXG|S_IRWXO; | 104 | mode = ( 0 & (S_ISVTX|S_ISUID|S_ISGID|S_IRWXU|S_IRWXG|S_IRWXO)); |
105 | if ( parse_mode(*argv, &mode) == FALSE ) { | 105 | if ( parse_mode(*argv, &mode) == FALSE ) { |
106 | fprintf(stderr, "%s: Unknown mode: %s\n", invocationName, *argv); | 106 | fprintf(stderr, "%s: Unknown mode: %s\n", invocationName, *argv); |
107 | exit( FALSE); | 107 | exit( FALSE); |
diff --git a/coreutils/mkdir.c b/coreutils/mkdir.c index 98c8d8f08..0d0a90ec3 100644 --- a/coreutils/mkdir.c +++ b/coreutils/mkdir.c | |||
@@ -33,21 +33,32 @@ static const char mkdir_usage[] = "Usage: mkdir [OPTION] DIRECTORY...\n" | |||
33 | 33 | ||
34 | 34 | ||
35 | static int parentFlag = FALSE; | 35 | static int parentFlag = FALSE; |
36 | static int permFlag = FALSE; | 36 | static mode_t mode = 777; |
37 | static mode_t mode = 0777; | ||
38 | 37 | ||
39 | 38 | ||
40 | extern int mkdir_main(int argc, char **argv) | 39 | extern int mkdir_main(int argc, char **argv) |
41 | { | 40 | { |
41 | int i=FALSE; | ||
42 | argc--; | 42 | argc--; |
43 | argv++; | 43 | argv++; |
44 | 44 | ||
45 | /* Parse any options */ | 45 | /* Parse any options */ |
46 | while (argc > 1 && **argv == '-') { | 46 | while (argc > 0 && **argv == '-') { |
47 | while (*++(*argv)) | 47 | while (i==FALSE && *++(*argv)) { |
48 | switch (**argv) { | 48 | switch (**argv) { |
49 | case 'm': | 49 | case 'm': |
50 | permFlag = TRUE; | 50 | if (--argc == 0) |
51 | usage( mkdir_usage); | ||
52 | /* Find the specified modes */ | ||
53 | mode = 0; | ||
54 | if ( parse_mode(*(++argv), &mode) == FALSE ) { | ||
55 | fprintf(stderr, "Unknown mode: %s\n", *argv); | ||
56 | exit( FALSE); | ||
57 | } | ||
58 | /* Set the umask for this process so it doesn't | ||
59 | * screw up whatever the user just entered. */ | ||
60 | umask(0); | ||
61 | i=TRUE; | ||
51 | break; | 62 | break; |
52 | case 'p': | 63 | case 'p': |
53 | parentFlag = TRUE; | 64 | parentFlag = TRUE; |
@@ -55,6 +66,7 @@ extern int mkdir_main(int argc, char **argv) | |||
55 | default: | 66 | default: |
56 | usage( mkdir_usage); | 67 | usage( mkdir_usage); |
57 | } | 68 | } |
69 | } | ||
58 | argc--; | 70 | argc--; |
59 | argv++; | 71 | argv++; |
60 | } | 72 | } |
@@ -64,11 +76,13 @@ extern int mkdir_main(int argc, char **argv) | |||
64 | usage( mkdir_usage); | 76 | usage( mkdir_usage); |
65 | } | 77 | } |
66 | 78 | ||
67 | while (--argc > 0) { | 79 | while (argc > 0) { |
80 | int status; | ||
68 | struct stat statBuf; | 81 | struct stat statBuf; |
69 | if (stat(*(++argv), &statBuf) != ENOENT) { | 82 | status=stat(*argv, &statBuf); |
83 | if (status != -1 && status != ENOENT ) { | ||
70 | fprintf(stderr, "%s: File exists\n", *argv); | 84 | fprintf(stderr, "%s: File exists\n", *argv); |
71 | return( FALSE); | 85 | exit( FALSE); |
72 | } | 86 | } |
73 | if (parentFlag == TRUE) | 87 | if (parentFlag == TRUE) |
74 | createPath(*argv, mode); | 88 | createPath(*argv, mode); |
@@ -78,6 +92,8 @@ extern int mkdir_main(int argc, char **argv) | |||
78 | exit( FALSE); | 92 | exit( FALSE); |
79 | } | 93 | } |
80 | } | 94 | } |
95 | argc--; | ||
96 | argv++; | ||
81 | } | 97 | } |
82 | exit( TRUE); | 98 | exit( TRUE); |
83 | } | 99 | } |
@@ -33,21 +33,32 @@ static const char mkdir_usage[] = "Usage: mkdir [OPTION] DIRECTORY...\n" | |||
33 | 33 | ||
34 | 34 | ||
35 | static int parentFlag = FALSE; | 35 | static int parentFlag = FALSE; |
36 | static int permFlag = FALSE; | 36 | static mode_t mode = 777; |
37 | static mode_t mode = 0777; | ||
38 | 37 | ||
39 | 38 | ||
40 | extern int mkdir_main(int argc, char **argv) | 39 | extern int mkdir_main(int argc, char **argv) |
41 | { | 40 | { |
41 | int i=FALSE; | ||
42 | argc--; | 42 | argc--; |
43 | argv++; | 43 | argv++; |
44 | 44 | ||
45 | /* Parse any options */ | 45 | /* Parse any options */ |
46 | while (argc > 1 && **argv == '-') { | 46 | while (argc > 0 && **argv == '-') { |
47 | while (*++(*argv)) | 47 | while (i==FALSE && *++(*argv)) { |
48 | switch (**argv) { | 48 | switch (**argv) { |
49 | case 'm': | 49 | case 'm': |
50 | permFlag = TRUE; | 50 | if (--argc == 0) |
51 | usage( mkdir_usage); | ||
52 | /* Find the specified modes */ | ||
53 | mode = 0; | ||
54 | if ( parse_mode(*(++argv), &mode) == FALSE ) { | ||
55 | fprintf(stderr, "Unknown mode: %s\n", *argv); | ||
56 | exit( FALSE); | ||
57 | } | ||
58 | /* Set the umask for this process so it doesn't | ||
59 | * screw up whatever the user just entered. */ | ||
60 | umask(0); | ||
61 | i=TRUE; | ||
51 | break; | 62 | break; |
52 | case 'p': | 63 | case 'p': |
53 | parentFlag = TRUE; | 64 | parentFlag = TRUE; |
@@ -55,6 +66,7 @@ extern int mkdir_main(int argc, char **argv) | |||
55 | default: | 66 | default: |
56 | usage( mkdir_usage); | 67 | usage( mkdir_usage); |
57 | } | 68 | } |
69 | } | ||
58 | argc--; | 70 | argc--; |
59 | argv++; | 71 | argv++; |
60 | } | 72 | } |
@@ -64,11 +76,13 @@ extern int mkdir_main(int argc, char **argv) | |||
64 | usage( mkdir_usage); | 76 | usage( mkdir_usage); |
65 | } | 77 | } |
66 | 78 | ||
67 | while (--argc > 0) { | 79 | while (argc > 0) { |
80 | int status; | ||
68 | struct stat statBuf; | 81 | struct stat statBuf; |
69 | if (stat(*(++argv), &statBuf) != ENOENT) { | 82 | status=stat(*argv, &statBuf); |
83 | if (status != -1 && status != ENOENT ) { | ||
70 | fprintf(stderr, "%s: File exists\n", *argv); | 84 | fprintf(stderr, "%s: File exists\n", *argv); |
71 | return( FALSE); | 85 | exit( FALSE); |
72 | } | 86 | } |
73 | if (parentFlag == TRUE) | 87 | if (parentFlag == TRUE) |
74 | createPath(*argv, mode); | 88 | createPath(*argv, mode); |
@@ -78,6 +92,8 @@ extern int mkdir_main(int argc, char **argv) | |||
78 | exit( FALSE); | 92 | exit( FALSE); |
79 | } | 93 | } |
80 | } | 94 | } |
95 | argc--; | ||
96 | argv++; | ||
81 | } | 97 | } |
82 | exit( TRUE); | 98 | exit( TRUE); |
83 | } | 99 | } |
@@ -540,11 +540,9 @@ parse_mode( const char* s, mode_t* theMode) | |||
540 | groups |= S_ISUID|S_ISGID|S_IRWXU|S_IRWXG|S_IRWXO; | 540 | groups |= S_ISUID|S_ISGID|S_IRWXU|S_IRWXG|S_IRWXO; |
541 | break; | 541 | break; |
542 | default: | 542 | default: |
543 | if ( isdigit(c) && c >= '0' && c <= '7' && mode == 0 && groups == 0 ) { | 543 | if ( isdigit(c) && c >= '0' && c <= '7' && |
544 | andMode = 0; | 544 | mode == 0 && groups == 0 ) { |
545 | orMode = strtol(--s, NULL, 8); | 545 | *theMode = strtol(--s, NULL, 8); |
546 | *theMode &= andMode; | ||
547 | *theMode |= orMode; | ||
548 | return (TRUE); | 546 | return (TRUE); |
549 | } | 547 | } |
550 | else | 548 | else |