Loading...
gen/FreeBSD/setmode.c.patch /dev/null Libc-583
--- /dev/null
+++ Libc/Libc-583/gen/FreeBSD/setmode.c.patch
@@ -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 */