Module: ngircd.git Branch: master Commit: b8433e9261c516d7b8743b33681050b6666192e5 URL: http://ngircd.barton.de/cgi-bin/gitweb.cgi?p=ngircd.git&a=commit;h=b8433...
Author: Alexander Barton alex@barton.de Date: Tue Nov 12 00:28:50 2013 +0100
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 http://www.stacken.kth.se/lists/heimdal-discuss/2004-05/msg00059.html
---
configure.ng | 35 +++++++++++++++++++++++++++++++++-- src/ipaddr/ng_ipaddr.c | 2 +- src/ngircd/resolve.c | 2 +- 3 files changed, 35 insertions(+), 4 deletions(-)
diff --git a/configure.ng b/configure.ng index 9a4cc99..bc30bed 100644 --- a/configure.ng +++ b/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 <stdio.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <netdb.h> +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? diff --git a/src/ipaddr/ng_ipaddr.c b/src/ipaddr/ng_ipaddr.c index 9cf35ec..37f75b6 100644 --- a/src/ipaddr/ng_ipaddr.c +++ b/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; diff --git a/src/ngircd/resolve.c b/src/ngircd/resolve.c index 6078da8..01f730c 100644 --- a/src/ngircd/resolve.c +++ b/src/ngircd/resolve.c @@ -242,7 +242,7 @@ ForwardLookup(const char *hostname, array *IpAddr, int af) { ng_ipaddr_t addr;
-#ifdef HAVE_GETADDRINFO +#ifdef HAVE_WORKING_GETADDRINFO int res; struct addrinfo *a, *ai_results; static struct addrinfo hints;