Make mkdir -m work
This commit was genuinely broken at the time (not related to our build system): regexp.c bu commit'te eklendi ama karsilik gelen regexp.h unutuldu, 11 commit sonra (c8fdb5638) eklendi - o araliktaki her commit gercekten derlenemezdi
No binary (build failed)
—
(log yok)
| @@ -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 | |
| @@ -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); | |
| @@ -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); | |
| } | |
| @@ -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); | |
| } | |
| @@ -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 | |