diff options
-rw-r--r-- | lib/lib.c | 90 |
1 files changed, 29 insertions, 61 deletions
@@ -899,73 +899,43 @@ char *num_to_sig(int sig) /* mode parsing */ -#define USR_FLAGS (S_IRWXU) -#define GRP_FLAGS (S_IRWXG) -#define OTH_FLAGS (S_IRWXO) -#define SGT_FLAGS (S_ISUID | S_ISGID | S_ISVTX) - -#define MODE_WHAT(v, w, x, y, z) { \ - if (x & v) \ - y |= S_I##w##z;\ - } -#define MODE_READ(x, y, z) MODE_WHAT(0x04, R, x, y, z) -#define MODE_WRITE(x, y, z) MODE_WHAT(0x02, W, x, y, z) -#define MODE_EXEC(x, y, z) MODE_WHAT(0x01, X, x, y, z) -#define MODE_SUID(x, y) MODE_WHAT(0x08, S, x, y, UID) -#define MODE_SGID(x, y) MODE_WHAT(0x08, S, x, y, GID) -#define MODE_SVTX(x, y) MODE_WHAT(0x10, S, x, y, VTX) - -mode_t -apply_mode(int who, int how, int what, mode_t base) +mode_t apply_mode(int who, int how, int what, mode_t base) { - mode_t new_mode = 0; - mode_t tmp_mode = 0; - mode_t tmp_mask = USR_FLAGS | GRP_FLAGS | OTH_FLAGS | SGT_FLAGS; - if (who & 0x01) { - /* u */ - MODE_READ(what, tmp_mode, USR); - MODE_WRITE(what, tmp_mode, USR); - MODE_EXEC(what, tmp_mode, USR); - MODE_SUID(what, tmp_mode) - tmp_mask &= (GRP_FLAGS | OTH_FLAGS | SGT_FLAGS); + mode_t new_mode = 0, tmp_mode = 0, tmp_mask = 0; + + if (!who) tmp_mask = 07777; + if (who & 0x01) { // u + if (what & 0x01) tmp_mode |= S_IXUSR; + if (what & 0x02) tmp_mode |= S_IWUSR; + if (what & 0x04) tmp_mode |= S_IRUSR; + if (what & 0x08) tmp_mode |= S_ISUID; + tmp_mask |= S_IRWXU; } - if (who & 0x02) { - /* g */ - MODE_READ(what, tmp_mode, GRP); - MODE_WRITE(what, tmp_mode, GRP); - MODE_EXEC(what, tmp_mode, GRP); - MODE_SGID(what, tmp_mode) - tmp_mask &= (USR_FLAGS | OTH_FLAGS | SGT_FLAGS); + if (who & 0x02) { // g + if (what & 0x01) tmp_mode |= S_IXGRP; + if (what & 0x02) tmp_mode |= S_IWUSR; + if (what & 0x04) tmp_mode |= S_IRUSR; + if (what & 0x08) tmp_mode |= S_ISGID; + tmp_mask |= S_IRWXG; } - if (who & 0x04) { - /* o */ - MODE_READ(what, tmp_mode, OTH); - MODE_WRITE(what, tmp_mode, OTH); - MODE_EXEC(what, tmp_mode, OTH); - tmp_mask &= (USR_FLAGS | GRP_FLAGS | SGT_FLAGS); + if (who & 0x04) { // o + if (what & 0x01) tmp_mode |= S_IXOTH; + if (what & 0x02) tmp_mode |= S_IWOTH; + if (what & 0x04) tmp_mode |= S_IROTH; + tmp_mask |= S_IRWXO; } /* check sticky */ - MODE_SVTX(what, tmp_mode); - switch (how){ - case 1: - /* set */ - new_mode = tmp_mode | (base & tmp_mask); - break; - case 2: - /* add */ - new_mode = base | tmp_mode; - break; - case 3: - /* remove */ - new_mode = base & ~(tmp_mode); - break; - } + if (what & 0x10) tmp_mode |= S_ISVTX; + + if (how == 1) new_mode = tmp_mode | (base & tmp_mask); + else if (how == 2) new_mode = base | tmp_mode; + else if (how == 3) new_mode = base & ~(tmp_mode); + return new_mode; } -mode_t -string_to_mode(char *mode_str, mode_t base) +mode_t string_to_mode(char *mode_str, mode_t base) { mode_t new_mode; int what = 0; @@ -977,9 +947,7 @@ string_to_mode(char *mode_str, mode_t base) return base; if (isdigit(mode_str[0])) { tmp = strtol(mode_str, &p, 8); - if (*p || tmp < 0 || - (tmp & ~(OTH_FLAGS | SGT_FLAGS | GRP_FLAGS | USR_FLAGS))) - return base; + if (*p || tmp < 0 || (tmp & ~(07777))) return base; new_mode = (mode_t) tmp; return new_mode; } |