]> git.saurik.com Git - apple/libc.git/blobdiff - gen/FreeBSD/setmode.c.patch
Libc-583.tar.gz
[apple/libc.git] / gen / FreeBSD / setmode.c.patch
diff --git a/gen/FreeBSD/setmode.c.patch b/gen/FreeBSD/setmode.c.patch
new file mode 100644 (file)
index 0000000..c6bf7a1
--- /dev/null
@@ -0,0 +1,103 @@
+--- 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 */