commit b8433e9261c516d7b8743b33681050b6666192e5 from: Alexander Barton date: Fri Dec 27 20:35:13 2013 UTC Check for working getaddrinfo() function At least AIX 4.3.3 and 5.1 have a broken implementation of getaddrinfo() which doesn't handle "0" as numeric service correctly. This patch adds a configure check for this case and changes all calling functions to only use getaddrinfo() if it "works". See commit - 5a424f60dad660815d89285da9a7a07e4991461a commit + b8433e9261c516d7b8743b33681050b6666192e5 blob - 9a4cc992d41796b41317493eda0e963afa35bc21 blob + bc30bed8a721a4b05f42d2d1fccd6b7dd85cb8d9 --- configure.ng +++ configure.ng @@ -93,6 +93,35 @@ AC_DEFUN([GCC_STACK_PROTECT_CC],[ fi ]) +AC_DEFUN([WORKING_GETADDRINFO],[ + AC_CHECK_FUNCS([getaddrinfo],[ + AC_MSG_CHECKING([whether getaddrinfo() works]) + AC_TRY_RUN([ +#include +#include +#include +#include +int +main(int argc, char **argv) +{ + struct addrinfo hints, *ai; + memset(&hints, 0, sizeof(hints)); + hints.ai_flags = AI_PASSIVE; + hints.ai_socktype = SOCK_STREAM; + hints.ai_family = PF_UNSPEC; + if(getaddrinfo(NULL, "0", &hints, &ai) != 0) + return 1; + return 0; +} + ],[ + AC_DEFINE([HAVE_WORKING_GETADDRINFO], 1, [getaddrinfo(0)]) + AC_MSG_RESULT(yes) + ],[ + AC_MSG_RESULT(no) + ]) + ]) +]) + # -- Hard coded system and compiler dependencies/features/options ... -- if test "$GCC" = "yes"; then @@ -189,11 +218,13 @@ AC_CHECK_FUNCS([ \ AC_MSG_ERROR([required function missing!])) # Optional functions -AC_CHECK_FUNCS_ONCE([ \ - arc4random arc4random_stir gai_strerror getaddrinfo getnameinfo inet_aton +AC_CHECK_FUNCS_ONCE([ + arc4random arc4random_stir gai_strerror getnameinfo inet_aton \ sigaction sigprocmask snprintf vsnprintf strdup strndup strlcpy strlcat \ strtok_r unsetenv waitpid]) +WORKING_GETADDRINFO + # -- Configuration options -- # use syslog? blob - 9cf35ec976325f312dc30672ad8e8fc417b96e90 blob + 37f75b6de919f64d7ddbdfb9ac24a5b3d0e51a75 --- src/ipaddr/ng_ipaddr.c +++ src/ipaddr/ng_ipaddr.c @@ -23,7 +23,7 @@ GLOBAL bool ng_ipaddr_init(ng_ipaddr_t *addr, const char *ip_str, UINT16 port) { -#ifdef HAVE_GETADDRINFO +#ifdef HAVE_WORKING_GETADDRINFO int ret; char portstr[64]; struct addrinfo *res0; blob - 6078da8b48a9b6adecec99761f9ea7c2ec1f2188 blob + 01f730cc868a67458e7120cfc6d1e1485b9c4aa8 --- src/ngircd/resolve.c +++ src/ngircd/resolve.c @@ -242,7 +242,7 @@ ForwardLookup(const char *hostname, array *IpAddr, int { ng_ipaddr_t addr; -#ifdef HAVE_GETADDRINFO +#ifdef HAVE_WORKING_GETADDRINFO int res; struct addrinfo *a, *ai_results; static struct addrinfo hints;