| From 6cc1c22cc30320f56da552a76bd956db8f255b6a Mon Sep 17 00:00:00 2001 |
| From: Natanael Copa <ncopa@alpinelinux.org> |
| Date: Wed, 18 Nov 2015 10:05:07 +0000 |
| Subject: [PATCH] Use configure to test for feature instead of platform |
| |
| Test for various functions instead of trying to keep track of what |
| platform and what version of the given platform has support for what. |
| |
| This should make it easier to port to currently unknown platforms and |
| will solve the issue if a platform add support for a missing feature in |
| the future. |
| |
| The features we test for are: |
| - getifaddrs |
| - getauxval |
| - issetugid |
| - __secure_getenv |
| |
| This is needed for musl libc. |
| |
| Signed-off-by: Natanael Copa <ncopa@alpinelinux.org> |
| [Retrieved (and slightly updated) from: |
| http://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] |
| Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com> |
| --- |
| open-vm-tools/configure.ac | 4 ++++ |
| open-vm-tools/lib/misc/idLinux.c | 30 ++++++++++++++---------------- |
| open-vm-tools/lib/nicInfo/nicInfoPosix.c | 8 ++++++-- |
| 3 files changed, 24 insertions(+), 18 deletions(-) |
| |
| Index: open-vm-tools/configure.ac |
| =================================================================== |
| --- open-vm-tools.orig/configure.ac |
| +++ open-vm-tools/configure.ac |
| @@ -798,6 +798,7 @@ AC_CHECK_FUNCS( |
| |
| AC_CHECK_FUNCS([ecvt]) |
| AC_CHECK_FUNCS([fcvt]) |
| +AC_CHECK_FUNCS([getifaddrs getauxval issetugid __secure_getenv]) |
| |
| AC_CHECK_FUNC([mkdtemp], [have_mkdtemp=yes]) |
| |
| @@ -1063,10 +1064,13 @@ AC_PATH_PROG( |
| ### |
| |
| AC_CHECK_HEADERS([crypt.h]) |
| +AC_CHECK_HEADERS([ifaddrs.h]) |
| AC_CHECK_HEADERS([inttypes.h]) |
| AC_CHECK_HEADERS([stdint.h]) |
| AC_CHECK_HEADERS([stdlib.h]) |
| AC_CHECK_HEADERS([wchar.h]) |
| +AC_CHECK_HEADERS([net/if.h]) |
| +AC_CHECK_HEADERS([sys/auxv.h]) |
| AC_CHECK_HEADERS([sys/inttypes.h]) |
| AC_CHECK_HEADERS([sys/io.h]) |
| AC_CHECK_HEADERS([sys/param.h]) # Required to make the sys/user.h check work correctly on FreeBSD |
| Index: open-vm-tools/lib/misc/idLinux.c |
| =================================================================== |
| --- open-vm-tools.orig/lib/misc/idLinux.c |
| +++ open-vm-tools/lib/misc/idLinux.c |
| @@ -27,12 +27,9 @@ |
| #include <sys/syscall.h> |
| #include <string.h> |
| #include <unistd.h> |
| -#ifdef __linux__ |
| -#if defined(__GLIBC__) && \ |
| - (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 16)) |
| +#ifdef HAVE_SYS_AUXV_H |
| #include <sys/auxv.h> |
| #endif |
| -#endif |
| #ifdef __APPLE__ |
| #include <sys/socket.h> |
| #include <TargetConditionals.h> |
| @@ -997,31 +994,32 @@ Id_EndSuperUser(uid_t uid) // IN: |
| static Bool |
| IdIsSetUGid(void) |
| { |
| -#if defined(__ANDROID__) |
| - /* Android does not have a secure_getenv, so be conservative. */ |
| - return TRUE; |
| -#else |
| /* |
| * We use __secure_getenv, which returns NULL if the binary is |
| - * setuid or setgid. Alternatives include, |
| + * setuid or setgid, when issetugid or getauxval(AT_SECURE) is not |
| + * available. Alternatives include, |
| * |
| - * a) getauxval(AT_SECURE); not available until glibc 2.16. |
| - * b) __libc_enable_secure; may not be exported. |
| + * a) issetugid(); not (yet?) available in glibc. |
| + * b) getauxval(AT_SECURE); not available until glibc 2.16. |
| + * c) __libc_enable_secure; may not be exported. |
| * |
| - * Use (a) when we are based on glibc 2.16, or newer. |
| + * Use (b) when we are based on glibc 2.16, or newer. |
| */ |
| |
| -#if defined(__GLIBC__) && \ |
| - (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 16)) |
| +#if HAVE_ISSETUGID |
| + return issetugid(); |
| +#elif HAVE_GETAUXVAL |
| return getauxval(AT_SECURE) != 0; |
| -#else |
| +#elif HAVE___SECURE_GETENV |
| static const char envName[] = "VMW_SETUGID_TEST"; |
| |
| if (setenv(envName, "1", TRUE) == -1) { |
| return TRUE; /* Conservative */ |
| } |
| return __secure_getenv(envName) == NULL; |
| -#endif |
| +#else |
| + /* Android does not have a secure_getenv, so be conservative. */ |
| + return TRUE; |
| #endif |
| } |
| #endif |
| Index: open-vm-tools/lib/nicInfo/nicInfoPosix.c |
| =================================================================== |
| --- open-vm-tools.orig/lib/nicInfo/nicInfoPosix.c |
| +++ open-vm-tools/lib/nicInfo/nicInfoPosix.c |
| @@ -34,9 +34,13 @@ |
| #include <sys/socket.h> |
| #include <sys/stat.h> |
| #include <errno.h> |
| -#if defined(__FreeBSD__) || defined(__APPLE__) |
| +#if HAVE_SYS_SYSCTL_H |
| # include <sys/sysctl.h> |
| +#endif |
| +#if HAVE_IFADDRS_H |
| # include <ifaddrs.h> |
| +#endif |
| +#if HAVE_NET_IF_H |
| # include <net/if.h> |
| #endif |
| #ifndef NO_DNET |
| @@ -348,10 +352,7 @@ GuestInfoGetNicInfo(NicInfoV3 *nicInfo) |
| * |
| ****************************************************************************** |
| */ |
| -#if defined(__FreeBSD__) || \ |
| - defined(__APPLE__) || \ |
| - defined(USERWORLD) || \ |
| - (defined(__linux__) && defined(NO_DNET)) |
| +#if defined(NO_DNET) && defined(HAVE_GETIFADDRS) |
| |
| char * |
| GuestInfoGetPrimaryIP(void) |