--- setmode.c.orig 2008-02-08 00:45:35.000000000 -0800 +++ setmode.c 2008-02-17 19:36:02.000000000 -0800 @@ -70,12 +70,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. @@ -151,6 +154,7 @@ common: if (set->cmd2 & CMD2_CLR) { return (newmode); } } +#endif /* BUILDING_VARIANT */ #define ADDCMD(a, b, c, d) \ if (set >= endset) { \ @@ -169,7 +173,11 @@ 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) @@ -211,12 +219,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 +270,9 @@ getop: if ((op = *p++) != '+' && 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 +286,9 @@ getop: if ((op = *p++) != '+' && 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; @@ -402,13 +423,14 @@ 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 +__private_extern__ void compress_mode(set) BITCMD *set; { @@ -457,3 +479,4 @@ compress_mode(set) } } } +#endif /* BUILDING_VARIANT */