aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>1999-10-22 18:18:31 +0000
committerEric Andersen <andersen@codepoet.org>1999-10-22 18:18:31 +0000
commitfa0540fb091625499b90285bafa061c665e0c636 (patch)
treeb0a130e8b224f980f1ea234c0d1d47590ebe748c
parent8eefd021ca7a0b14e46e6bbff2d885ca9da0ea96 (diff)
downloadbusybox-w32-fa0540fb091625499b90285bafa061c665e0c636.tar.gz
busybox-w32-fa0540fb091625499b90285bafa061c665e0c636.tar.bz2
busybox-w32-fa0540fb091625499b90285bafa061c665e0c636.zip
Make mkdir -m work
-rw-r--r--Changelog3
-rw-r--r--chmod_chown_chgrp.c2
-rw-r--r--coreutils/mkdir.c32
-rw-r--r--mkdir.c32
-rw-r--r--utility.c8
5 files changed, 55 insertions, 22 deletions
diff --git a/Changelog b/Changelog
index 8948f7985..ab113a644 100644
--- a/Changelog
+++ b/Changelog
@@ -1,3 +1,6 @@
10.32
2 * Fixed mkdir -m option so that it works.
3
10.31 40.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
35static int parentFlag = FALSE; 35static int parentFlag = FALSE;
36static int permFlag = FALSE; 36static mode_t mode = 777;
37static mode_t mode = 0777;
38 37
39 38
40extern int mkdir_main(int argc, char **argv) 39extern 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}
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"
33 33
34 34
35static int parentFlag = FALSE; 35static int parentFlag = FALSE;
36static int permFlag = FALSE; 36static mode_t mode = 777;
37static mode_t mode = 0777;
38 37
39 38
40extern int mkdir_main(int argc, char **argv) 39extern 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}
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)
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