Make mkdir -m work

This commit is contained in:
Eric Andersen 1999-10-22 18:18:31 +00:00
parent 8eefd021ca
commit fa0540fb09
5 changed files with 55 additions and 22 deletions

View File

@ -1,3 +1,6 @@
0.32
* Fixed mkdir -m option so that it works.
0.31 0.31
* I added a changelog for version 0.30. * I added a changelog for version 0.30.
* adjusted find internals to make it smaller, and removed * adjusted find internals to make it smaller, and removed

View File

@ -101,7 +101,7 @@ int chmod_chown_chgrp_main(int argc, char **argv)
if ( whichApp == CHMOD_APP ) { if ( whichApp == CHMOD_APP ) {
/* Find the specified modes */ /* 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 ) { if ( parse_mode(*argv, &mode) == FALSE ) {
fprintf(stderr, "%s: Unknown mode: %s\n", invocationName, *argv); fprintf(stderr, "%s: Unknown mode: %s\n", invocationName, *argv);
exit( FALSE); exit( FALSE);

View File

@ -33,21 +33,32 @@ static const char mkdir_usage[] = "Usage: mkdir [OPTION] DIRECTORY...\n"
static int parentFlag = FALSE; static int parentFlag = FALSE;
static int permFlag = FALSE; static mode_t mode = 777;
static mode_t mode = 0777;
extern int mkdir_main(int argc, char **argv) extern int mkdir_main(int argc, char **argv)
{ {
int i=FALSE;
argc--; argc--;
argv++; argv++;
/* Parse any options */ /* Parse any options */
while (argc > 1 && **argv == '-') { while (argc > 0 && **argv == '-') {
while (*++(*argv)) while (i==FALSE && *++(*argv)) {
switch (**argv) { switch (**argv) {
case 'm': 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; break;
case 'p': case 'p':
parentFlag = TRUE; parentFlag = TRUE;
@ -55,6 +66,7 @@ extern int mkdir_main(int argc, char **argv)
default: default:
usage( mkdir_usage); usage( mkdir_usage);
} }
}
argc--; argc--;
argv++; argv++;
} }
@ -64,11 +76,13 @@ extern int mkdir_main(int argc, char **argv)
usage( mkdir_usage); usage( mkdir_usage);
} }
while (--argc > 0) { while (argc > 0) {
int status;
struct stat statBuf; struct stat statBuf;
if (stat(*(++argv), &statBuf) != ENOENT) { status=stat(*argv, &statBuf);
if (status != -1 && status != ENOENT ) {
fprintf(stderr, "%s: File exists\n", *argv); fprintf(stderr, "%s: File exists\n", *argv);
return( FALSE); exit( FALSE);
} }
if (parentFlag == TRUE) if (parentFlag == TRUE)
createPath(*argv, mode); createPath(*argv, mode);
@ -78,6 +92,8 @@ extern int mkdir_main(int argc, char **argv)
exit( FALSE); exit( FALSE);
} }
} }
argc--;
argv++;
} }
exit( TRUE); exit( TRUE);
} }

32
mkdir.c
View File

@ -33,21 +33,32 @@ static const char mkdir_usage[] = "Usage: mkdir [OPTION] DIRECTORY...\n"
static int parentFlag = FALSE; static int parentFlag = FALSE;
static int permFlag = FALSE; static mode_t mode = 777;
static mode_t mode = 0777;
extern int mkdir_main(int argc, char **argv) extern int mkdir_main(int argc, char **argv)
{ {
int i=FALSE;
argc--; argc--;
argv++; argv++;
/* Parse any options */ /* Parse any options */
while (argc > 1 && **argv == '-') { while (argc > 0 && **argv == '-') {
while (*++(*argv)) while (i==FALSE && *++(*argv)) {
switch (**argv) { switch (**argv) {
case 'm': 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; break;
case 'p': case 'p':
parentFlag = TRUE; parentFlag = TRUE;
@ -55,6 +66,7 @@ extern int mkdir_main(int argc, char **argv)
default: default:
usage( mkdir_usage); usage( mkdir_usage);
} }
}
argc--; argc--;
argv++; argv++;
} }
@ -64,11 +76,13 @@ extern int mkdir_main(int argc, char **argv)
usage( mkdir_usage); usage( mkdir_usage);
} }
while (--argc > 0) { while (argc > 0) {
int status;
struct stat statBuf; struct stat statBuf;
if (stat(*(++argv), &statBuf) != ENOENT) { status=stat(*argv, &statBuf);
if (status != -1 && status != ENOENT ) {
fprintf(stderr, "%s: File exists\n", *argv); fprintf(stderr, "%s: File exists\n", *argv);
return( FALSE); exit( FALSE);
} }
if (parentFlag == TRUE) if (parentFlag == TRUE)
createPath(*argv, mode); createPath(*argv, mode);
@ -78,6 +92,8 @@ extern int mkdir_main(int argc, char **argv)
exit( FALSE); exit( FALSE);
} }
} }
argc--;
argv++;
} }
exit( TRUE); exit( TRUE);
} }

View File

@ -540,11 +540,9 @@ parse_mode( const char* s, mode_t* theMode)
groups |= S_ISUID|S_ISGID|S_IRWXU|S_IRWXG|S_IRWXO; groups |= S_ISUID|S_ISGID|S_IRWXU|S_IRWXG|S_IRWXO;
break; break;
default: default:
if ( isdigit(c) && c >= '0' && c <= '7' && mode == 0 && groups == 0 ) { if ( isdigit(c) && c >= '0' && c <= '7' &&
andMode = 0; mode == 0 && groups == 0 ) {
orMode = strtol(--s, NULL, 8); *theMode = strtol(--s, NULL, 8);
*theMode &= andMode;
*theMode |= orMode;
return (TRUE); return (TRUE);
} }
else else