From da7d7951c3b4f11485accf54e8e925c04709ed78 Mon Sep 17 00:00:00 2001 From: Natanael Copa 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 --- configure.ac | 4 ++++ lib/misc/idLinux.c | 30 +++++++++++------------- lib/nicInfo/nicInfoPosix.c | 11 +++++---- 3 files changed, 24 insertions(+), 21 deletions(-) --- a/configure.ac +++ b/configure.ac @@ -1179,6 +1179,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]) @@ -1388,10 +1389,13 @@ fi ### 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 --- a/lib/misc/idLinux.c +++ b/lib/misc/idLinux.c @@ -27,12 +27,9 @@ #include #include #include -#ifdef __linux__ -#if defined(__GLIBC__) && \ - (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 16)) +#ifdef HAVE_SYS_AUXV_H #include #endif -#endif #ifdef __APPLE__ #include #include @@ -1025,24 +1022,23 @@ 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 included * - * 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) 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"; /* @@ -1062,7 +1058,9 @@ IdIsSetUGid(void) return secure_getenv(envName) == NULL; } return TRUE; -#endif +#else + /* Android does not have a secure_getenv, so be conservative. */ + return TRUE; #endif } #endif --- a/lib/nicInfo/nicInfoPosix.c +++ b/lib/nicInfo/nicInfoPosix.c @@ -35,9 +35,13 @@ #include #include #include -#if defined(__FreeBSD__) || defined(__APPLE__) +#if HAVE_SYS_SYSCTL_H # include +#endif +#if HAVE_IFADDRS_H # include +#endif +#if HAVE_NET_IF_H # include #endif #ifndef NO_DNET @@ -499,10 +503,7 @@ GuestInfoGetNicInfo(unsigned int maxIPv4 * ****************************************************************************** */ -#if defined(__FreeBSD__) || \ - defined(__APPLE__) || \ - defined(USERWORLD) || \ - (defined(__linux__) && defined(NO_DNET)) +#if defined(NO_DNET) && defined(HAVE_GETIFADDRS) char * GuestInfoGetPrimaryIP(void)