From c1e2e005b4e99070f58a3545bad54ef41a634ad1 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Wed, 7 Oct 2015 17:32:56 +0200 Subject: [PATCH] ash: shrink "umask -S" code function old new delta umaskcmd 279 286 +7 static.permmode 3 - -3 static.permmask 18 - -18 Signed-off-by: Denys Vlasenko --- shell/ash.c | 31 ++++++++++++++----------------- 1 file 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);