aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2015-10-07 17:32:56 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2015-10-07 17:32:56 +0200
commitc1e2e005b4e99070f58a3545bad54ef41a634ad1 (patch)
tree1683ff3199c445686ef79a7ce74cb19e36985c9b
parent6283f9828320ef5e0be0b060b7f26522b529ed42 (diff)
downloadbusybox-w32-c1e2e005b4e99070f58a3545bad54ef41a634ad1.tar.gz
busybox-w32-c1e2e005b4e99070f58a3545bad54ef41a634ad1.tar.bz2
busybox-w32-c1e2e005b4e99070f58a3545bad54ef41a634ad1.zip
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 <vda.linux@googlemail.com>
-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)
12816static int FAST_FUNC 12816static int FAST_FUNC
12817umaskcmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM) 12817umaskcmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
12818{ 12818{
12819 static const char permuser[3] ALIGN1 = "ugo"; 12819 static const char permuser[3] ALIGN1 = "ogu";
12820 static const char permmode[3] ALIGN1 = "rwx";
12821 static const short permmask[] ALIGN2 = {
12822 S_IRUSR, S_IWUSR, S_IXUSR,
12823 S_IRGRP, S_IWGRP, S_IXGRP,
12824 S_IROTH, S_IWOTH, S_IXOTH
12825 };
12826 12820
12827 mode_t mask; 12821 mode_t mask;
12828 int i;
12829 int symbolic_mode = 0; 12822 int symbolic_mode = 0;
12830 12823
12831 while (nextopt("S") != '\0') { 12824 while (nextopt("S") != '\0') {
@@ -12839,22 +12832,26 @@ umaskcmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
12839 12832
12840 if (*argptr == NULL) { 12833 if (*argptr == NULL) {
12841 if (symbolic_mode) { 12834 if (symbolic_mode) {
12842 char buf[18]; 12835 char buf[sizeof("u=rwx,g=rwx,o=rwx")];
12843 char *p = buf; 12836 char *p = buf;
12837 int i;
12844 12838
12845 for (i = 0; i < 3; i++) { 12839 i = 2;
12846 int j; 12840 for (;;) {
12841 unsigned bits;
12847 12842
12848 *p++ = permuser[i]; 12843 *p++ = permuser[i];
12849 *p++ = '='; 12844 *p++ = '=';
12850 for (j = 0; j < 3; j++) { 12845 /* mask is 0..0uuugggooo. i=2 selects uuu bits */
12851 if ((mask & permmask[3 * i + j]) == 0) { 12846 bits = (mask >> (i*3));
12852 *p++ = permmode[j]; 12847 if (!(bits & 4)) *p++ = 'r';
12853 } 12848 if (!(bits & 2)) *p++ = 'w';
12854 } 12849 if (!(bits & 1)) *p++ = 'x';
12850 if (--i < 0)
12851 break;
12855 *p++ = ','; 12852 *p++ = ',';
12856 } 12853 }
12857 *--p = '\0'; 12854 *p = '\0';
12858 puts(buf); 12855 puts(buf);
12859 } else { 12856 } else {
12860 out1fmt("%.4o\n", mask); 12857 out1fmt("%.4o\n", mask);