X-Git-Url: https://git.saurik.com/apple/libc.git/blobdiff_plain/9385eb3d10ebe5eb398c52040ec3dbfba9b0cdcf..refs/heads/master:/gen/FreeBSD/setmode.c?ds=inline diff --git a/gen/FreeBSD/setmode.c b/gen/FreeBSD/setmode.c index 3e4a6ee..53b79d2 100644 --- a/gen/FreeBSD/setmode.c +++ b/gen/FreeBSD/setmode.c @@ -13,10 +13,6 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. @@ -38,7 +34,7 @@ static char sccsid[] = "@(#)setmode.c 8.2 (Berkeley) 3/25/94"; #endif /* LIBC_SCCS and not lint */ #include -__FBSDID("$FreeBSD: src/lib/libc/gen/setmode.c,v 1.9 2003/02/23 00:24:03 mikeh Exp $"); +__FBSDID("$FreeBSD: src/lib/libc/gen/setmode.c,v 1.11 2007/01/09 00:27:55 imp Exp $"); #include "namespace.h" #include @@ -70,12 +66,15 @@ typedef struct bitcmd { #define CMD2_OBITS 0x08 #define CMD2_UBITS 0x10 +#define compress_mode _sm_compress_mode + static BITCMD *addcmd(BITCMD *, int, int, int, u_int); -static void compress_mode(BITCMD *); +__private_extern__ void compress_mode(BITCMD *); #ifdef SETMODE_DEBUG static void dumpmode(BITCMD *); #endif +#ifndef BUILDING_VARIANT /* * Given the old mode and an array of bitcmd structures, apply the operations * described in the bitcmd structures to the old mode, and return the new mode. @@ -83,9 +82,7 @@ static void dumpmode(BITCMD *); * bits) followed by a '+' (set bits). */ mode_t -getmode(bbox, omode) - const void *bbox; - mode_t omode; +getmode(const void *bbox, mode_t omode) { const BITCMD *set; mode_t clrval, newmode, value; @@ -151,6 +148,7 @@ common: if (set->cmd2 & CMD2_CLR) { return (newmode); } } +#endif /* BUILDING_VARIANT */ #define ADDCMD(a, b, c, d) \ if (set >= endset) { \ @@ -169,11 +167,14 @@ common: if (set->cmd2 & CMD2_CLR) { } \ set = addcmd(set, (a), (b), (c), (d)) +#ifndef VARIANT_LEGACY +#define STANDARD_BITS (S_ISUID|S_ISGID|S_IRWXU|S_IRWXG|S_IRWXO|S_ISTXT) +#else /* VARIANT_LEGACY */ #define STANDARD_BITS (S_ISUID|S_ISGID|S_IRWXU|S_IRWXG|S_IRWXO) +#endif /* !VARIANT_LEGACY */ void * -setmode(p) - const char *p; +setmode(const char *p) { int perm, who; char op, *ep; @@ -211,12 +212,21 @@ setmode(p) */ if (isdigit((unsigned char)*p)) { perml = strtol(p, &ep, 8); - if (*ep || perml < 0 || perml & ~(STANDARD_BITS|S_ISTXT)) { +#ifndef VARIANT_LEGACY + if (*ep || perml < 0 || perml & ~STANDARD_BITS) +#else /* VARIANT_LEGACY */ + if (*ep || perml < 0 || perml & ~(STANDARD_BITS|S_ISTXT)) +#endif /* !VARIANT_LEGACY */ + { free(saveset); return (NULL); } perm = (mode_t)perml; +#ifndef VARIANT_LEGACY + ADDCMD('=', STANDARD_BITS, perm, mask); +#else /* VARIANT_LEGACY */ ADDCMD('=', (STANDARD_BITS|S_ISTXT), perm, mask); +#endif /* !VARIANT_LEGACY */ set->cmd = 0; return (saveset); } @@ -253,7 +263,9 @@ getop: if ((op = *p++) != '+' && op != '-' && op != '=') { if (op == '=') equalopdone = 0; +#ifdef VARIANT_LEGACY who &= ~S_ISTXT; +#endif /* VARIANT_LEGACY */ for (perm = 0, permXbits = 0;; ++p) { switch (*p) { case 'r': @@ -267,7 +279,9 @@ getop: if ((op = *p++) != '+' && op != '-' && op != '=') { case 't': /* If only "other" bits ignore sticky. */ if (!who || who & ~S_IRWXO) { +#ifdef VARIANT_LEGACY who |= S_ISTXT; +#endif /* VARIANT_LEGACY */ perm |= S_ISTXT; } break; @@ -340,11 +354,7 @@ apply: if (!*p) } static BITCMD * -addcmd(set, op, who, oparg, mask) - BITCMD *set; - int oparg, who; - int op; - u_int mask; +addcmd(BITCMD *set, int op, int who, int oparg, u_int mask) { switch (op) { case '=': @@ -388,8 +398,7 @@ addcmd(set, op, who, oparg, mask) #ifdef SETMODE_DEBUG static void -dumpmode(set) - BITCMD *set; +dumpmode(BITCMD *set) { for (; set->cmd; ++set) (void)printf("cmd: '%c' bits %04o%s%s%s%s%s%s\n", @@ -402,15 +411,15 @@ dumpmode(set) } #endif +#ifndef BUILDING_VARIANT /* * Given an array of bitcmd structures, compress by compacting consecutive * '+', '-' and 'X' commands into at most 3 commands, one of each. The 'u', * 'g' and 'o' commands continue to be separate. They could probably be * compacted, but it's not worth the effort. */ -static void -compress_mode(set) - BITCMD *set; +__private_extern__ void +compress_mode(BITCMD *set) { BITCMD *nset; int setbits, clrbits, Xbits, op; @@ -457,3 +466,4 @@ compress_mode(set) } } } +#endif /* BUILDING_VARIANT */