diff --git a/Changelog b/Changelog index 8948f7985..ab113a644 100644 --- 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 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) 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); 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" 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 98c8d8f08..0d0a90ec3 100644 --- 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); } diff --git a/utility.c b/utility.c index a653bb325..421492dca 100644 --- 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