Make mkdir -m work
This commit is contained in:
parent
8eefd021ca
commit
fa0540fb09
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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
32
mkdir.c
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user