]> git.saurik.com Git - apple/libc.git/blobdiff - gen/setmode-fbsd.c
Libc-763.13.tar.gz
[apple/libc.git] / gen / setmode-fbsd.c
index 3e4a6ee8972c67431f115a21cb0b8ebe5033e569..53b79d21d624948b6b8b82bbce7627068e5a52b3 100644 (file)
  * 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 <sys/cdefs.h>
-__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 <sys/types.h>
@@ -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 */