--- /dev/null
+--- 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 */