From 31f49e7968db5d0d569513992baa6d25dde8aa58 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Sat, 21 Jul 2012 22:45:05 -0500 Subject: Make chmod +w respect umask, implement +s and +t, fix ls to show suid/sgid/stid without x bit. --- lib/lib.c | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) (limited to 'lib') diff --git a/lib/lib.c b/lib/lib.c index 2b321099..69029a2c 100644 --- a/lib/lib.c +++ b/lib/lib.c @@ -983,16 +983,20 @@ mode_t string_to_mode(char *modestr, mode_t mode) // Gaze into the bin of permission... for (;;) { - int i, j, dowho, dohow, dowhat; + int i, j, dowho, dohow, dowhat, amask; - dowho = dohow = dowhat = 0; + dowho = dohow = dowhat = amask = 0; // Find the who, how, and what stanzas, in that order while (*str && (s = strchr(whos, *str))) { dowho |= 1<<(s-whos); str++; } - if (!dowho) dowho = 8; + // If who isn't specified, like "a" but honoring umask. + if (!dowho) { + dowho = 8; + umask(amask=umask(0)); + } if (!*str || !(s = strchr(hows, *str))) goto barf; dohow = *(str++); @@ -1018,19 +1022,26 @@ mode_t string_to_mode(char *modestr, mode_t mode) for (i=0; i<4; i++) { for (j=0; j<3; j++) { mode_t bit = 0; + int where = 1<<((3*i)+j); + + if (amask & where) continue; // Figure out new value at this location if (i == 3) { - } else if (dowhat&(1<