nwrap: slightly simplify logic in nwrap_getaddrinfo()
[nss_wrapper.git] / ConfigureChecks.cmake
index 338500f0f772a8127513d5e7d6b8635f4f92045c..1b6ba01e45e5cef97cb40edb8dc700c80ed8a29e 100644 (file)
@@ -49,7 +49,10 @@ endif(CMAKE_COMPILER_IS_GNUCC AND NOT MINGW AND NOT OS2)
 # HEADERS
 check_include_file(sys/types.h HAVE_SYS_TYPES_H)
 check_include_file(pwd.h HAVE_PWD_H)
+check_include_file(shadow.h HAVE_SHADOW_H)
 check_include_file(grp.h HAVE_GRP_H)
+check_include_file(nss.h HAVE_NSS_H)
+check_include_file(nss_common.h HAVE_NSS_COMMON_H)
 
 # FUNCTIONS
 check_function_exists(strncpy HAVE_STRNCPY)
@@ -60,12 +63,20 @@ check_function_exists(getpwnam_r HAVE_GETPWNAM_R)
 check_function_exists(getpwuid_r HAVE_GETPWUID_R)
 check_function_exists(getpwent_r HAVE_GETPWENT_R)
 
+check_function_exists(setspent HAVE_SETSPENT)
+check_function_exists(getspnam HAVE_GETSPNAM)
+
 check_function_exists(getgrnam_r HAVE_GETGRNAM_R)
 check_function_exists(getgrgid_r HAVE_GETGRGID_R)
 check_function_exists(getgrent_r HAVE_GETGRENT_R)
 
 check_function_exists(getgrouplist HAVE_GETGROUPLIST)
 
+check_function_exists(gethostbyaddr_r HAVE_GETHOSTBYADDR_R)
+check_function_exists(gethostbyname_r HAVE_GETHOSTBYNAME_R)
+
+check_function_exists(gethostbyname2 HAVE_GETHOSTBYNAME2)
+
 if (WIN32)
     check_function_exists(_vsnprintf_s HAVE__VSNPRINTF_S)
     check_function_exists(_vsnprintf HAVE__VSNPRINTF)
@@ -73,23 +84,110 @@ if (WIN32)
     check_function_exists(_snprintf_s HAVE__SNPRINTF_S)
 endif (WIN32)
 
+if (UNIX)
+    if (NOT LINUX)
+        # libsocket (Solaris)
+        check_library_exists(socket getaddrinfo "" HAVE_LIBSOCKET)
+        if (HAVE_LIBSOCKET)
+          set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} socket)
+        endif (HAVE_LIBSOCKET)
+
+        # libnsl/inet_pton (Solaris)
+        check_library_exists(nsl inet_pton "" HAVE_LIBNSL)
+        if (HAVE_LIBNSL)
+            set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} nsl)
+        endif (HAVE_LIBNSL)
+    endif (NOT LINUX)
+
+    check_function_exists(getaddrinfo HAVE_GETADDRINFO)
+endif (UNIX)
+
+if (SOLARIS)
+    check_function_exists(__posix_getpwnam_r HAVE___POSIX_GETPWNAM_R)
+    check_function_exists(__posix_getpwuid_r HAVE___POSIX_GETPWUID_R)
+
+    check_function_exists(__posix_getgrgid_r HAVE___POSIX_GETGRGID_R)
+    check_function_exists(__posix_getgrnam_r HAVE___POSIX_GETGRNAM_R)
+endif (SOLARIS)
+
 check_function_exists(asprintf HAVE_ASPRINTF)
 if (UNIX AND HAVE_ASPRINTF)
     add_definitions(-D_GNU_SOURCE)
 endif (UNIX AND HAVE_ASPRINTF)
 
-
+set(CMAKE_REQUIRED_DEFINITIONS -D_POSIX_PTHREAD_SEMANTICS)
 check_prototype_definition(getpwent_r
- "struct passwd *getpwent_r(struct passwd *src, char *buf, int buflen)"
- "NULL"
- "unistd.h;pwd.h"
- SOLARIS_GETPWENT_R)
   "struct passwd *getpwent_r(struct passwd *src, char *buf, int buflen)"
   "NULL"
   "unistd.h;pwd.h"
   HAVE_SOLARIS_GETPWENT_R)
 
-check_prototype_definition(getpwent_r
- "struct group *getpwent_r(struct group *src, char *buf, int buflen)"
- "NULL"
- "unistd.h;pwd.h"
- SOLARIS_GETGRENT_R)
+check_prototype_definition(getpwnam_r
+    "int getpwnam_r(const char *name, struct passwd *pwd, char *buf, int buflen, struct passwd **ppwd)"
+    "-1"
+    "unistd.h;pwd.h"
+    HAVE_SOLARIS_GETPWNAM_R)
+
+check_prototype_definition(getpwuid_r
+    "int getpwuid_r(uid_t uid, struct passwd *pwd, char *buf, int buflen, struct passwd **ppwd)"
+    "-1"
+    "unistd.h;pwd.h"
+    HAVE_SOLARIS_GETPWUID_R)
+
+check_prototype_definition(getgrent_r
+    "struct group *getgrent_r(struct group *src, char *buf, int buflen)"
+    "NULL"
+    "unistd.h;grp.h"
+    HAVE_SOLARIS_GETGRENT_R)
+
+check_prototype_definition(getgrnam_r
+    "int getgrnam_r(const char *name, struct group *grp, char *buf, int buflen, struct group **pgrp)"
+    "-1"
+    "unistd.h;grp.h"
+    HAVE_SOLARIS_GETGRNAM_R)
+
+check_prototype_definition(getgrgid_r
+    "int getgrgid_r(gid_t gid, struct group *grp, char *buf, int buflen, struct group **pgrp)"
+    "-1"
+    "unistd.h;grp.h"
+    HAVE_SOLARIS_GETGRGID_R)
+
+check_prototype_definition(sethostent
+    "int sethostent(int stayopen)"
+    "-1"
+    "unistd.h;netdb.h"
+    HAVE_SOLARIS_SETHOSTENT)
+
+check_prototype_definition(endhostent
+    "int endhostent(void)"
+    "-1"
+    "unistd.h;netdb.h"
+    HAVE_SOLARIS_ENDHOSTENT)
+
+check_prototype_definition(gethostname
+    "int gethostname(char *name, int len)"
+    "-1"
+    "unistd.h;netdb.h"
+    HAVE_SOLARIS_GETHOSTNAME)
+set(CMAKE_REQUIRED_DEFINITIONS)
+
+check_prototype_definition(setgrent
+    "int setgrent(void)"
+    "-1"
+    "unistd.h;grp.h"
+    HAVE_BSD_SETGRENT)
+
+check_prototype_definition(getnameinfo
+    "int getnameinfo (const struct sockaddr *sa, socklen_t salen, char *host, socklen_t __hostlen, char *serv, socklen_t servlen, int flags)"
+    "-1"
+    "unistd.h;netdb.h"
+    HAVE_LINUX_GETNAMEINFO)
+
+check_prototype_definition(getnameinfo
+    "int getnameinfo (const struct sockaddr *sa, socklen_t salen, char *host, socklen_t __hostlen, char *serv, socklen_t servlen, unsigned int flags)"
+    "-1"
+    "unistd.h;netdb.h"
+    HAVE_LINUX_GETNAMEINFO_UNSIGNED)
 
 # STRUCT MEMBERS
 check_struct_has_member("struct sockaddr" sa_len "sys/socket.h netinet/in.h" HAVE_STRUCT_SOCKADDR_SA_LEN)
@@ -126,6 +224,25 @@ int main(void) {
     return 0;
 }" HAVE_IPV6)
 
+check_c_source_compiles("
+void log_fn(const char *format, ...) __attribute__ ((format (printf, 1, 2)));
+
+int main(void) {
+    return 0;
+}" HAVE_ATTRIBUTE_PRINTF_FORMAT)
+
+check_c_source_compiles("
+void test_destructor_attribute(void) __attribute__ ((destructor));
+
+void test_destructor_attribute(void)
+{
+    return;
+}
+
+int main(void) {
+    return 0;
+}" HAVE_DESTRUCTOR_ATTRIBUTE)
+
 check_library_exists(dl dlopen "" HAVE_LIBDL)
 if (HAVE_LIBDL)
     find_library(DLFCN_LIBRARY dl)
@@ -137,4 +254,4 @@ if (NOT WIN32)
     test_big_endian(WORDS_BIGENDIAN)
 endif (NOT WIN32)
 
-set(NSSWRAP_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} CACHE INTERNAL "nsswrap required system libraries")
+set(NWRAP_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} CACHE INTERNAL "nss_wrapper required system libraries")