aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--shell/ash.c31
1 files changed, 14 insertions, 17 deletions
diff --git a/shell/ash.c b/shell/ash.c
index 2669157bc..80dfc1d6a 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -12816,16 +12816,9 @@ readcmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
static int FAST_FUNC
umaskcmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
{
- static const char permuser[3] ALIGN1 = "ugo";
- static const char permmode[3] ALIGN1 = "rwx";
- static const short permmask[] ALIGN2 = {
- S_IRUSR, S_IWUSR, S_IXUSR,
- S_IRGRP, S_IWGRP, S_IXGRP,
- S_IROTH, S_IWOTH, S_IXOTH
- };
+ static const char permuser[3] ALIGN1 = "ogu";
mode_t mask;
- int i;
int symbolic_mode = 0;
while (nextopt("S") != '\0') {
@@ -12839,22 +12832,26 @@ umaskcmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
if (*argptr == NULL) {
if (symbolic_mode) {
- char buf[18];
+ char buf[sizeof("u=rwx,g=rwx,o=rwx")];
char *p = buf;
+ int i;
- for (i = 0; i < 3; i++) {
- int j;
+ i = 2;
+ for (;;) {
+ unsigned bits;
*p++ = permuser[i];
*p++ = '=';
- for (j = 0; j < 3; j++) {
- if ((mask & permmask[3 * i + j]) == 0) {
- *p++ = permmode[j];
- }
- }
+ /* mask is 0..0uuugggooo. i=2 selects uuu bits */
+ bits = (mask >> (i*3));
+ if (!(bits & 4)) *p++ = 'r';
+ if (!(bits & 2)) *p++ = 'w';
+ if (!(bits & 1)) *p++ = 'x';
+ if (--i < 0)
+ break;
*p++ = ',';
}
- *--p = '\0';
+ *p = '\0';
puts(buf);
} else {
out1fmt("%.4o\n", mask);