]> git.ipfire.org Git - thirdparty/sarg.git/commitdiff
Attempt to fix a FreeBSD IP address resolution
authorFrédéric Marchal <fmarchal@users.sourceforge.net>
Thu, 4 Aug 2011 06:10:43 +0000 (06:10 +0000)
committerFrédéric Marchal <fmarchal@users.sourceforge.net>
Thu, 4 Aug 2011 06:10:43 +0000 (06:10 +0000)
According to this post:

http://lists.freebsd.org/pipermail/freebsd-standards/2005-July/000948.html

Some old version of FreeBSD requires that the sa_len of the sockaddr_in
structure be initialized with the exact length passed to getnameinfo.

As Linux doesn't have the sa_len member, it is not initialized in sarg.
Therefore the IP address resolution fails when sarg is compiled on FreeBSD.

CMakeLists.txt
configure.in
include/config.h.in
include/info.h
ip2name.c

index b646aa17715169ba50187505e4dd9e2515cf3491..faacb751431e14319aaa5322ff3327a53ecd1e5e 100755 (executable)
@@ -3,7 +3,7 @@ PROJECT(sarg C)
 SET(sarg_VERSION 2)
 SET(sarg_REVISION "3.2-pre2")
 SET(sarg_BUILD "")
-SET(sarg_BUILDDATE "Aug-01-2011")
+SET(sarg_BUILDDATE "Aug-04-2011")
 
 INCLUDE(AddFileDependencies)
 INCLUDE(CheckIncludeFile)
@@ -12,6 +12,7 @@ INCLUDE(CheckFunctionExists)
 INCLUDE(CheckTypeSize)
 INCLUDE(CheckSymbolExists)
 INCLUDE(CheckCCompilerFlag)
+INCLUDE(CheckStructHasMember)
 
 DEFINE_PROPERTY(GLOBAL PROPERTY enable-htmldir BRIEF_DOCS "--enable-htmldir=htmldir"
                         FULL_DOCS "Select htmldir as the root of your WWW documents")
@@ -95,10 +96,10 @@ CHECK_INCLUDE_FILE(time.h HAVE_TIME_H)
 CHECK_INCLUDE_FILE(unistd.h HAVE_UNISTD_H)
 CHECK_INCLUDE_FILE(sys/dirent.h HAVE_SYS_DIRENT_H)
 CHECK_INCLUDE_FILE(dirent.h HAVE_DIRENT_H)
+CHECK_INCLUDE_FILE(sys/types.h HAVE_SYS_TYPES_H)
 CHECK_INCLUDE_FILE(sys/socket.h HAVE_SYS_SOCKET_H)
 CHECK_INCLUDE_FILE(netdb.h HAVE_NETDB_H)
 CHECK_INCLUDE_FILE(arpa/inet.h HAVE_ARPA_INET_H)
-CHECK_INCLUDE_FILE(sys/types.h HAVE_SYS_TYPES_H)
 CHECK_INCLUDE_FILE(netinet/in.h HAVE_NETINET_H)
 CHECK_INCLUDE_FILE(sys/stat.h HAVE_SYS_STAT_H)
 CHECK_INCLUDE_FILE(ctype.h HAVE_CTYPE_H)
@@ -149,6 +150,8 @@ CHECK_FUNCTION_EXISTS(getnameinfo HAVE_GETNAMEINFO)
 CHECK_FUNCTION_EXISTS(getaddrinfo HAVE_GETADDRINFO)
 CHECK_FUNCTION_EXISTS(inet_aton HAVE_INET_ATON)
 
+CHECK_STRUCT_HAS_MEMBER("struct sockaddr_storage" ss_len sys/socket.h HAVE_SOCKADDR_SA_LEN)
+
 # Find gd
 CHECK_INCLUDE_FILE(gd.h HAVE_GD_H)
 IF(HAVE_GD_H)
index e72a60e9f1f9e024b99d1407c21347c928d75d0d..9b9a62070c6b1e7cd15166a77263f1614e2abfb9 100644 (file)
@@ -72,7 +72,7 @@ if test -n "$LIBICONV" ; then
 fi
 
 AC_CHECK_HEADERS(stdio.h stdlib.h string.h strings.h sys/time.h time.h unistd.h sys/dirent.h \
-               dirent.h sys/socket.h netdb.h arpa/inet.h sys/types.h netinet/in.h sys/stat.h \
+               dirent.h sys/types.h sys/socket.h netdb.h arpa/inet.h netinet/in.h sys/stat.h \
                ctype.h gd.h gdfontl.h gdfontt.h gdfonts.h gdfontmb.h gdfontg.h iconv.h \
                errno.h sys/resource.h sys/wait.h stdarg.h inttypes.h limits.h locale.h \
                execinfo.h ldap.h math.h libintl.h libgen.h stdbool.h getopt.h)
@@ -133,6 +133,9 @@ AC_CHECK_FUNCS(lstat)
 AC_CHECK_FUNCS(getnameinfo)
 AC_CHECK_FUNCS(getaddrinfo)
 
+dnl check for structure members
+AC_CHECK_MEMBER([struct sockaddr_storage.ss_len],[AC_DEFINE([HAVE_SOCKADDR_SA_LEN],1,[ss_len in sockaddr_storage])])
+
 dnl check for the rlim_t size
 AC_CHECK_SIZEOF(rlim_t,1,[#if HAVE_SYS_RESOURCE_H
 #include <sys/resource.h>
index ccfa37ef7a8bab30588623c57da9463db26cfd7a..7563997a72b14b3ba3a766c1d418ecb50754369e 100644 (file)
@@ -61,6 +61,8 @@
 #cmakedefine HAVE_GETADDRINFO
 #cmakedefine HAVE_INET_ATON
 
+#cmakedefine HAVE_SOCKADDR_SA_LEN
+
 #define RLIM_STRING "@RLIM_STRING@"
 #define ICONV_CONST @ICONV_CONST@
 
index 9089e8e35c9224b1a9053bd54b1b67aee34f392b..5ba9e4ea8cb6518152100dcf61a87b707cd9c857 100755 (executable)
@@ -1,3 +1,3 @@
-#define VERSION PACKAGE_VERSION" Aug-01-2011"
+#define VERSION PACKAGE_VERSION" Aug-04-2011"
 #define PGM PACKAGE_NAME
 #define URL "http://sarg.sourceforge.net"
index f2b96c03d95a2198553a9e69b5503a4fce3b0dfb..4657a5158e65e44df0698c694be4106c24ec5fa2 100644 (file)
--- a/ip2name.c
+++ b/ip2name.c
@@ -34,6 +34,7 @@ void ip2name(char *ip,int ip_len)
 {
 #ifdef HAVE_GETNAMEINFO
        struct sockaddr_storage sa;
+       int sockaddr_size;
        char host[NI_MAXHOST];
        int n1,n2,n3,n4,next=0;
        int error;
@@ -43,12 +44,17 @@ void ip2name(char *ip,int ip_len)
                struct sockaddr_in *s4=(struct sockaddr_in *)&sa;
                if (inet_pton(AF_INET,ip,&s4->sin_addr)!=1) return;
                sa.ss_family=AF_INET;
+               sockaddr_size=sizeof(*s4);
        } else {
                struct sockaddr_in6 *s6=(struct sockaddr_in6 *)&sa;
                if (inet_pton(AF_INET6,ip,&s6->sin6_addr)!=1) return;
                sa.ss_family=AF_INET6;
+               sockaddr_size=sizeof(*s6);
        }
-       error=getnameinfo((struct sockaddr *)&sa,sizeof(sa),host,sizeof(host),NULL,0,0);
+#ifdef HAVE_SOCKADDR_SA_LEN
+       sa.ss_len=sockaddr_size;
+#endif
+       error=getnameinfo((struct sockaddr *)&sa,sockaddr_size,host,sizeof(host),NULL,0,0);
        if (error==EAI_AGAIN) {
                /*
                This is a temporary failure. According to the man page we should try again but