aboutsummaryrefslogtreecommitdiff
path: root/libbb/parse_mode.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbb/parse_mode.c')
-rw-r--r--libbb/parse_mode.c16
1 files changed, 7 insertions, 9 deletions
diff --git a/libbb/parse_mode.c b/libbb/parse_mode.c
index 5a4e1c579..bddd39bca 100644
--- a/libbb/parse_mode.c
+++ b/libbb/parse_mode.c
@@ -15,7 +15,7 @@
15 15
16#define FILEMODEBITS (S_ISUID | S_ISGID | S_ISVTX | S_IRWXU | S_IRWXG | S_IRWXO) 16#define FILEMODEBITS (S_ISUID | S_ISGID | S_ISVTX | S_IRWXU | S_IRWXG | S_IRWXO)
17 17
18int FAST_FUNC bb_parse_mode(const char *s, mode_t *current_mode) 18int FAST_FUNC bb_parse_mode(const char *s, unsigned current_mode)
19{ 19{
20 static const mode_t who_mask[] = { 20 static const mode_t who_mask[] = {
21 S_ISUID | S_ISGID | S_ISVTX | S_IRWXU | S_IRWXG | S_IRWXO, /* a */ 21 S_ISUID | S_ISGID | S_ISVTX | S_IRWXU | S_IRWXG | S_IRWXO, /* a */
@@ -46,13 +46,12 @@ int FAST_FUNC bb_parse_mode(const char *s, mode_t *current_mode)
46 46
47 tmp = strtoul(s, &e, 8); 47 tmp = strtoul(s, &e, 8);
48 if (*e || (tmp > 07777U)) { /* Check range and trailing chars. */ 48 if (*e || (tmp > 07777U)) { /* Check range and trailing chars. */
49 return 0; 49 return -1;
50 } 50 }
51 *current_mode = tmp; 51 return tmp;
52 return 1;
53 } 52 }
54 53
55 new_mode = *current_mode; 54 new_mode = current_mode;
56 55
57 /* Note: we allow empty clauses, and hence empty modes. 56 /* Note: we allow empty clauses, and hence empty modes.
58 * We treat an empty mode as no change to perms. */ 57 * We treat an empty mode as no change to perms. */
@@ -71,7 +70,7 @@ int FAST_FUNC bb_parse_mode(const char *s, mode_t *current_mode)
71 if (*p == *s) { 70 if (*p == *s) {
72 wholist |= who_mask[(int)(p-who_chars)]; 71 wholist |= who_mask[(int)(p-who_chars)];
73 if (!*++s) { 72 if (!*++s) {
74 return 0; 73 return -1;
75 } 74 }
76 goto WHO_LIST; 75 goto WHO_LIST;
77 } 76 }
@@ -80,7 +79,7 @@ int FAST_FUNC bb_parse_mode(const char *s, mode_t *current_mode)
80 do { /* Process action list. */ 79 do { /* Process action list. */
81 if ((*s != '+') && (*s != '-')) { 80 if ((*s != '+') && (*s != '-')) {
82 if (*s != '=') { 81 if (*s != '=') {
83 return 0; 82 return -1;
84 } 83 }
85 /* Since op is '=', clear all bits corresponding to the 84 /* Since op is '=', clear all bits corresponding to the
86 * wholist, or all file bits if wholist is empty. */ 85 * wholist, or all file bits if wholist is empty. */
@@ -145,6 +144,5 @@ int FAST_FUNC bb_parse_mode(const char *s, mode_t *current_mode)
145 } while (*s && (*s != ',')); 144 } while (*s && (*s != ','));
146 } 145 }
147 146
148 *current_mode = new_mode; 147 return new_mode;
149 return 1;
150} 148}