Loading...
gen/FreeBSD/setmode.c.patch /dev/null Libc-763.13
--- /dev/null
+++ Libc/Libc-763.13/gen/FreeBSD/setmode.c.patch
@@ -0,0 +1,103 @@
+--- setmode.c.orig	2009-11-08 14:13:46.000000000 -0800
++++ setmode.c	2009-11-08 14:13:39.000000000 -0800
+@@ -66,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.
+@@ -145,6 +148,7 @@ common:			if (set->cmd2 & CMD2_CLR) {
+ 			return (newmode);
+ 		}
+ }
++#endif /* BUILDING_VARIANT */
+ 
+ #define	ADDCMD(a, b, c, d)						\
+ 	if (set >= endset) {						\
+@@ -163,7 +167,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(const char *p)
+@@ -204,12 +212,21 @@ setmode(const char *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);
+ 	}
+@@ -246,7 +263,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':
+@@ -260,7 +279,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;
+@@ -390,13 +411,14 @@ dumpmode(BITCMD *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(BITCMD *set)
+ {
+ 	BITCMD *nset;
+@@ -444,3 +466,4 @@ compress_mode(BITCMD *set)
+ 		}
+ 	}
+ }
++#endif /* BUILDING_VARIANT */