From 64102e9a5c04750c283f5fa72607a44f0d38c813 Mon Sep 17 00:00:00 2001 From: Yang Tse Date: Mon, 3 Jul 2006 15:32:12 +0000 Subject: [PATCH] Use CURL_CHECK_FUNC_GETNAMEINFO results in CURL_CHECK_NI_WITHSCOPEID --- acinclude.m4 | 80 +++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 70 insertions(+), 10 deletions(-) diff --git a/acinclude.m4 b/acinclude.m4 index dba89de6..e3f7583f 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -401,45 +401,106 @@ AC_DEFUN([CURL_CHECK_FUNC_GETNAMEINFO], [ ]) # AC_DEFUN +dnl TYPE_SOCKADDR_STORAGE +dnl ------------------------------------------------- +dnl Check for struct sockaddr_storage. Most IPv6-enabled +dnl hosts have it, but AIX 4.3 is one known exception. + +AC_DEFUN([TYPE_SOCKADDR_STORAGE], +[ + AC_CHECK_TYPE([struct sockaddr_storage], + AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE, 1, + [if struct sockaddr_storage is defined]), , + [ +#undef inline +#ifdef HAVE_WINDOWS_H +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#ifdef HAVE_WINSOCK2_H +#include +#endif +#else +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_INET_H +#include +#endif +#endif + ]) +]) + + dnl CURL_CHECK_NI_WITHSCOPEID dnl ------------------------------------------------- dnl Check for working NI_WITHSCOPEID in getnameinfo() AC_DEFUN([CURL_CHECK_NI_WITHSCOPEID], [ + AC_REQUIRE([CURL_CHECK_FUNC_GETNAMEINFO])dnl + AC_REQUIRE([TYPE_SOCKADDR_STORAGE])dnl + AC_CHECK_HEADERS(stdio.h sys/types.h sys/socket.h \ + netdb.h netinet/in.h arpa/inet.h) + # AC_CACHE_CHECK([for working NI_WITHSCOPEID], [ac_cv_working_ni_withscopeid], [ AC_RUN_IFELSE([ AC_LANG_PROGRAM([ +#ifdef HAVE_STDIO_H #include +#endif +#ifdef HAVE_SYS_TYPES_H #include +#endif +#ifdef HAVE_SYS_SOCKET_H #include +#endif +#ifdef HAVE_NETDB_H #include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_INET_H +#include +#endif ],[ -#ifdef NI_WITHSCOPEID - struct sockaddr_storage ss; - int sslen = sizeof(ss); +#if defined(NI_WITHSCOPEID) && defined(HAVE_GETNAMEINFO) +#ifdef HAVE_STRUCT_SOCKADDR_STORAGE + struct sockaddr_storage sa; +#else + unsigned char sa[256]; +#endif + char hostbuf[NI_MAXHOST]; int rc; - char hbuf[NI_MAXHOST]; + GETNAMEINFO_TYPE_ARG2 salen = (GETNAMEINFO_TYPE_ARG2)sizeof(sa); + GETNAMEINFO_TYPE_ARG46 hostlen = (GETNAMEINFO_TYPE_ARG46)sizeof(hostbuf); + GETNAMEINFO_TYPE_ARG7 flags = NI_NUMERICHOST | NI_NUMERICSERV | NI_WITHSCOPEID; int fd = socket(AF_INET6, SOCK_STREAM, 0); if(fd < 0) { perror("socket()"); return 1; /* Error creating socket */ } - rc = getsockname(fd, (struct sockaddr *)&ss, &sslen); + rc = getsockname(fd, (GETNAMEINFO_TYPE_ARG1)&sa, &salen); if(rc) { perror("getsockname()"); return 2; /* Error retrieving socket name */ } - rc = getnameinfo((struct sockaddr *)&ss, sslen, hbuf, sizeof(hbuf), - NULL, 0, - NI_NUMERICHOST | NI_NUMERICSERV | NI_WITHSCOPEID); + rc = getnameinfo((GETNAMEINFO_TYPE_ARG1)&sa, salen, hostbuf, hostlen, NULL, 0, flags); if(rc) { printf("rc = %s\n", gai_strerror(rc)); return 3; /* Error translating socket address */ } return 0; /* Ok, NI_WITHSCOPEID works */ #else - return 4; /* Error, NI_WITHSCOPEID not defined */ + return 4; /* Error, NI_WITHSCOPEID not defined or no getnameinfo() */ #endif ]) # AC_LANG_PROGRAM ],[ @@ -453,7 +514,6 @@ AC_DEFUN([CURL_CHECK_NI_WITHSCOPEID], [ # NI_WITHSCOPEID will work if we are able to compile it. AC_COMPILE_IFELSE([ AC_LANG_PROGRAM([ -#include #include #include #include