1*4882a593SmuzhiyunFrom 6cc1c22cc30320f56da552a76bd956db8f255b6a Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Natanael Copa <ncopa@alpinelinux.org>
3*4882a593SmuzhiyunDate: Wed, 18 Nov 2015 10:05:07 +0000
4*4882a593SmuzhiyunSubject: [PATCH] Use configure to test for feature instead of platform
5*4882a593Smuzhiyun
6*4882a593SmuzhiyunTest for various functions instead of trying to keep track of what
7*4882a593Smuzhiyunplatform and what version of the given platform has support for what.
8*4882a593Smuzhiyun
9*4882a593SmuzhiyunThis should make it easier to port to currently unknown platforms and
10*4882a593Smuzhiyunwill solve the issue if a platform add support for a missing feature in
11*4882a593Smuzhiyunthe future.
12*4882a593Smuzhiyun
13*4882a593SmuzhiyunThe features we test for are:
14*4882a593Smuzhiyun- getifaddrs
15*4882a593Smuzhiyun- getauxval
16*4882a593Smuzhiyun- issetugid
17*4882a593Smuzhiyun- __secure_getenv
18*4882a593Smuzhiyun
19*4882a593SmuzhiyunThis is needed for musl libc.
20*4882a593Smuzhiyun
21*4882a593SmuzhiyunSigned-off-by: Natanael Copa <ncopa@alpinelinux.org>
22*4882a593Smuzhiyun[Retrieved (and slightly updated) from:
23*4882a593Smuzhiyunhttp://cgit.openembedded.org/meta-openembedded/tree/meta-oe/recipes-support/open-vm-tools/open-vm-tools/0007-Use-configure-to-test-for-feature-instead-of-platfor.patch?h=sumo]
24*4882a593SmuzhiyunSigned-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
25*4882a593Smuzhiyun---
26*4882a593Smuzhiyun open-vm-tools/configure.ac               |  4 ++++
27*4882a593Smuzhiyun open-vm-tools/lib/misc/idLinux.c         | 30 ++++++++++++++----------------
28*4882a593Smuzhiyun open-vm-tools/lib/nicInfo/nicInfoPosix.c |  8 ++++++--
29*4882a593Smuzhiyun 3 files changed, 24 insertions(+), 18 deletions(-)
30*4882a593Smuzhiyun
31*4882a593SmuzhiyunIndex: open-vm-tools/configure.ac
32*4882a593Smuzhiyun===================================================================
33*4882a593Smuzhiyun--- open-vm-tools.orig/configure.ac
34*4882a593Smuzhiyun+++ open-vm-tools/configure.ac
35*4882a593Smuzhiyun@@ -798,6 +798,7 @@ AC_CHECK_FUNCS(
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun AC_CHECK_FUNCS([ecvt])
38*4882a593Smuzhiyun AC_CHECK_FUNCS([fcvt])
39*4882a593Smuzhiyun+AC_CHECK_FUNCS([getifaddrs getauxval issetugid __secure_getenv])
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun AC_CHECK_FUNC([mkdtemp], [have_mkdtemp=yes])
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun@@ -1063,10 +1064,13 @@ AC_PATH_PROG(
44*4882a593Smuzhiyun ###
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun AC_CHECK_HEADERS([crypt.h])
47*4882a593Smuzhiyun+AC_CHECK_HEADERS([ifaddrs.h])
48*4882a593Smuzhiyun AC_CHECK_HEADERS([inttypes.h])
49*4882a593Smuzhiyun AC_CHECK_HEADERS([stdint.h])
50*4882a593Smuzhiyun AC_CHECK_HEADERS([stdlib.h])
51*4882a593Smuzhiyun AC_CHECK_HEADERS([wchar.h])
52*4882a593Smuzhiyun+AC_CHECK_HEADERS([net/if.h])
53*4882a593Smuzhiyun+AC_CHECK_HEADERS([sys/auxv.h])
54*4882a593Smuzhiyun AC_CHECK_HEADERS([sys/inttypes.h])
55*4882a593Smuzhiyun AC_CHECK_HEADERS([sys/io.h])
56*4882a593Smuzhiyun AC_CHECK_HEADERS([sys/param.h]) # Required to make the sys/user.h check work correctly on FreeBSD
57*4882a593SmuzhiyunIndex: open-vm-tools/lib/misc/idLinux.c
58*4882a593Smuzhiyun===================================================================
59*4882a593Smuzhiyun--- open-vm-tools.orig/lib/misc/idLinux.c
60*4882a593Smuzhiyun+++ open-vm-tools/lib/misc/idLinux.c
61*4882a593Smuzhiyun@@ -27,12 +27,9 @@
62*4882a593Smuzhiyun #include <sys/syscall.h>
63*4882a593Smuzhiyun #include <string.h>
64*4882a593Smuzhiyun #include <unistd.h>
65*4882a593Smuzhiyun-#ifdef __linux__
66*4882a593Smuzhiyun-#if defined(__GLIBC__) && \
67*4882a593Smuzhiyun-           (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 16))
68*4882a593Smuzhiyun+#ifdef HAVE_SYS_AUXV_H
69*4882a593Smuzhiyun #include <sys/auxv.h>
70*4882a593Smuzhiyun #endif
71*4882a593Smuzhiyun-#endif
72*4882a593Smuzhiyun #ifdef __APPLE__
73*4882a593Smuzhiyun #include <sys/socket.h>
74*4882a593Smuzhiyun #include <TargetConditionals.h>
75*4882a593Smuzhiyun@@ -997,31 +994,32 @@ Id_EndSuperUser(uid_t uid)  // IN:
76*4882a593Smuzhiyun static Bool
77*4882a593Smuzhiyun IdIsSetUGid(void)
78*4882a593Smuzhiyun {
79*4882a593Smuzhiyun-#if defined(__ANDROID__)
80*4882a593Smuzhiyun-   /* Android does not have a secure_getenv, so be conservative. */
81*4882a593Smuzhiyun-   return TRUE;
82*4882a593Smuzhiyun-#else
83*4882a593Smuzhiyun    /*
84*4882a593Smuzhiyun     * We use __secure_getenv, which returns NULL if the binary is
85*4882a593Smuzhiyun-    * setuid or setgid. Alternatives include,
86*4882a593Smuzhiyun+    * setuid or setgid, when issetugid or getauxval(AT_SECURE) is not
87*4882a593Smuzhiyun+    * available. Alternatives include,
88*4882a593Smuzhiyun     *
89*4882a593Smuzhiyun-    *   a) getauxval(AT_SECURE); not available until glibc 2.16.
90*4882a593Smuzhiyun-    *   b) __libc_enable_secure; may not be exported.
91*4882a593Smuzhiyun+    *   a) issetugid(); not (yet?) available in glibc.
92*4882a593Smuzhiyun+    *   b) getauxval(AT_SECURE); not available until glibc 2.16.
93*4882a593Smuzhiyun+    *   c) __libc_enable_secure; may not be exported.
94*4882a593Smuzhiyun     *
95*4882a593Smuzhiyun-    * Use (a) when we are based on glibc 2.16, or newer.
96*4882a593Smuzhiyun+    * Use (b) when we are based on glibc 2.16, or newer.
97*4882a593Smuzhiyun     */
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun-#if defined(__GLIBC__) && \
100*4882a593Smuzhiyun-           (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 16))
101*4882a593Smuzhiyun+#if HAVE_ISSETUGID
102*4882a593Smuzhiyun+   return issetugid();
103*4882a593Smuzhiyun+#elif HAVE_GETAUXVAL
104*4882a593Smuzhiyun    return getauxval(AT_SECURE) != 0;
105*4882a593Smuzhiyun-#else
106*4882a593Smuzhiyun+#elif HAVE___SECURE_GETENV
107*4882a593Smuzhiyun    static const char envName[] = "VMW_SETUGID_TEST";
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun    if (setenv(envName, "1", TRUE) == -1) {
110*4882a593Smuzhiyun       return TRUE; /* Conservative */
111*4882a593Smuzhiyun    }
112*4882a593Smuzhiyun    return __secure_getenv(envName) == NULL;
113*4882a593Smuzhiyun-#endif
114*4882a593Smuzhiyun+#else
115*4882a593Smuzhiyun+   /* Android does not have a secure_getenv, so be conservative. */
116*4882a593Smuzhiyun+   return TRUE;
117*4882a593Smuzhiyun #endif
118*4882a593Smuzhiyun }
119*4882a593Smuzhiyun #endif
120*4882a593SmuzhiyunIndex: open-vm-tools/lib/nicInfo/nicInfoPosix.c
121*4882a593Smuzhiyun===================================================================
122*4882a593Smuzhiyun--- open-vm-tools.orig/lib/nicInfo/nicInfoPosix.c
123*4882a593Smuzhiyun+++ open-vm-tools/lib/nicInfo/nicInfoPosix.c
124*4882a593Smuzhiyun@@ -34,9 +34,13 @@
125*4882a593Smuzhiyun #include <sys/socket.h>
126*4882a593Smuzhiyun #include <sys/stat.h>
127*4882a593Smuzhiyun #include <errno.h>
128*4882a593Smuzhiyun-#if defined(__FreeBSD__) || defined(__APPLE__)
129*4882a593Smuzhiyun+#if HAVE_SYS_SYSCTL_H
130*4882a593Smuzhiyun # include <sys/sysctl.h>
131*4882a593Smuzhiyun+#endif
132*4882a593Smuzhiyun+#if HAVE_IFADDRS_H
133*4882a593Smuzhiyun # include <ifaddrs.h>
134*4882a593Smuzhiyun+#endif
135*4882a593Smuzhiyun+#if HAVE_NET_IF_H
136*4882a593Smuzhiyun # include <net/if.h>
137*4882a593Smuzhiyun #endif
138*4882a593Smuzhiyun #ifndef NO_DNET
139*4882a593Smuzhiyun@@ -348,10 +352,7 @@ GuestInfoGetNicInfo(NicInfoV3 *nicInfo)
140*4882a593Smuzhiyun  *
141*4882a593Smuzhiyun  ******************************************************************************
142*4882a593Smuzhiyun  */
143*4882a593Smuzhiyun-#if defined(__FreeBSD__) || \
144*4882a593Smuzhiyun-    defined(__APPLE__) || \
145*4882a593Smuzhiyun-    defined(USERWORLD) || \
146*4882a593Smuzhiyun-    (defined(__linux__) && defined(NO_DNET))
147*4882a593Smuzhiyun+#if defined(NO_DNET) && defined(HAVE_GETIFADDRS)
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun char *
150*4882a593Smuzhiyun GuestInfoGetPrimaryIP(void)
151