]> git.ipfire.org Git - thirdparty/sarg.git/commitdiff
Resolve IPv6 addresses when creating the datafile
authorFrédéric Marchal <fmarchal@users.sourceforge.net>
Fri, 21 Jan 2011 15:56:05 +0000 (15:56 +0000)
committerFrédéric Marchal <fmarchal@users.sourceforge.net>
Fri, 21 Jan 2011 15:56:05 +0000 (15:56 +0000)
There is an option to resolve the addresses of the visited web sites
into an IP address but the existing code was only capable of
converting host names to IPv4 addresses.

If getaddrinfo is available on the system, it is used to resolve the
host names.

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

index c6402abb76e2f238b6f620a716e3da3a2eee92eb..9c38d04473a7ccfe0a5f05e41869a35a327a6bfb 100755 (executable)
@@ -3,7 +3,7 @@ PROJECT(sarg C)
 SET(sarg_VERSION 2)
 SET(sarg_REVISION "3.2-pre1")
 SET(sarg_BUILD "")
-SET(sarg_BUILDDATE "Jan-12-2011")
+SET(sarg_BUILDDATE "Jan-21-2011")
 
 INCLUDE(AddFileDependencies)
 INCLUDE(CheckIncludeFile)
@@ -146,6 +146,7 @@ CHECK_FUNCTION_EXISTS(backtrace HAVE_BACKTRACE)
 CHECK_FUNCTION_EXISTS(symlink HAVE_SYMLINK)
 CHECK_FUNCTION_EXISTS(lstat HAVE_LSTAT)
 CHECK_FUNCTION_EXISTS(getnameinfo HAVE_GETNAMEINFO)
+CHECK_FUNCTION_EXISTS(getaddrinfo HAVE_GETADDRINFO)
 CHECK_FUNCTION_EXISTS(inet_aton HAVE_INET_ATON)
 
 # Find gd
index f0b5c6c80f664d79bee1b68c1585e6d5636aa750..ee812d6d5c8c34418403cf15080f3f0c2b54349d 100644 (file)
@@ -129,6 +129,7 @@ AC_CHECK_FUNCS(backtrace)
 AC_CHECK_FUNCS(symlink)
 AC_CHECK_FUNCS(lstat)
 AC_CHECK_FUNCS(getnameinfo)
+AC_CHECK_FUNCS(getaddrinfo)
 
 dnl check for the rlim_t size
 AC_CHECK_SIZEOF(rlim_t,1,[#if HAVE_SYS_RESOURCE_H
index 1b14fea69916e1c4d347e6581f9527f9d547b70c..9b57931ebf82aa9b56a4735b74a8a520c47c748b 100644 (file)
@@ -217,7 +217,7 @@ void saverecs(FILE *fp_ou, const struct userinfostruct *uinfo, long long int nac
        }
        if((DataFileFields & DATA_FIELD_URL) != 0) {
                url_hostname(url,name,sizeof(name));
-               if (DataFileUrl == DATAFILEURL_IP) name2ip(name);
+               if (DataFileUrl == DATAFILEURL_IP) name2ip(name,sizeof(name));
                fputs(name,fp_ou);
                fputc(DataFileDelimiter[0],fp_ou);
        }
index 0dbe838054762f543a27bf91ebf7b0bec8b6084d..ccfa37ef7a8bab30588623c57da9463db26cfd7a 100644 (file)
@@ -58,6 +58,7 @@
 #cmakedefine HAVE_SYMLINK
 #cmakedefine HAVE_LSTAT
 #cmakedefine HAVE_GETNAMEINFO
+#cmakedefine HAVE_GETADDRINFO
 #cmakedefine HAVE_INET_ATON
 
 #define RLIM_STRING "@RLIM_STRING@"
index 9892c84285d638c7b0ec3adebe8a9d4bcee691d1..97a9950d086f47a280247f4c6ad8cefa7c1195d1 100755 (executable)
@@ -136,7 +136,7 @@ void index_only(const char *dirname,int debug);
 
 // ip2name.c
 void ip2name(char *ip,int ip_len);
-void name2ip(char *name);
+void name2ip(char *name,int name_size);
 
 // lastlog.c
 void mklastlog(const char *outdir);
index 24b659d8e44766a8aabacfac42876fbaa12c2245..32ba2d23f54957ecc1200f854c344409cccd0089 100755 (executable)
@@ -1,3 +1,3 @@
-#define VERSION PACKAGE_VERSION" Jan-12-2011"
+#define VERSION PACKAGE_VERSION" Jan-21-2011"
 #define PGM PACKAGE_NAME
 #define URL "http://sarg.sourceforge.net"
index 066c596ff733edee3c004b34e9f3f3c901319c8e..ad1e6e552ca45236f4d234278bd985569f17396d 100644 (file)
--- a/ip2name.c
+++ b/ip2name.c
@@ -84,8 +84,53 @@ void ip2name(char *ip,int ip_len)
        return;
 }
 
-void name2ip(char *name)
+void name2ip(char *name,int name_size)
 {
+#ifdef HAVE_GETADDRINFO
+       int error;
+       char *port;
+       struct addrinfo *res;
+       char *addr;
+
+       addr=name;
+       if (name[0]=='[') { //IPv6 address
+               port=strchr(name,']');
+               if (port) { //confirmed IPv6 address
+                       *port='\0';
+                       addr++;
+               }
+       } else { //IPv4 address
+               port=strchr(name,':');
+               if (port) *port='\0';
+       }
+
+       error=getaddrinfo(addr,NULL,NULL,&res);
+       if (error) {
+               freeaddrinfo(res);
+               debuga(_("Cannot resolve host name %s: %s\n"),name,gai_strerror(error));
+               exit(EXIT_FAILURE);
+       }
+       if (res->ai_family==AF_INET) {
+               struct sockaddr_in *s4=(struct sockaddr_in *)res->ai_addr;
+               struct in_addr *sa=&s4->sin_addr;
+               if (res->ai_addrlen<sizeof(*s4)) {
+                       debuga(_("Short structure returned by getaddrinfo for an IPv4 address: %d bytes instead of %d\n"),res->ai_addrlen,sizeof(*s4));
+                       exit(EXIT_FAILURE);
+               }
+               inet_ntop(res->ai_family,sa,name,name_size);
+       } else if (res->ai_family==AF_INET6) {
+               struct sockaddr_in6 *s6=(struct sockaddr_in6 *)res->ai_addr;
+               struct in6_addr *sa6=&s6->sin6_addr;
+               if (res->ai_addrlen<sizeof(*s6)) {
+                       debuga(_("Short structure returned by getaddrinfo for an IPv6 address: %d bytes instead of %d\n"),res->ai_addrlen,sizeof(*s6));
+                       exit(EXIT_FAILURE);
+               }
+               inet_ntop(res->ai_family,sa6,name,name_size);
+       } else {
+               debuga(_("Invalid address type %d returned when resolving host name \"%s\"\n"),res->ai_family,name);
+       }
+       freeaddrinfo(res);
+#else
        struct in_addr ia;
        struct hostent *hp;
        char *port;
@@ -96,7 +141,7 @@ void name2ip(char *name)
        struct getwordstruct gwarea;
 
        port=strchr(name,':');
-       if (port) *port=0;
+       if (port) *port='\0';
 
        if((hp=gethostbyname(name))==NULL)
                return;
@@ -109,7 +154,8 @@ void name2ip(char *name)
                printf("SARG: Maybe you have a broken record or garbage in your %s ip address.\n",gwarea.beginning);
                exit(EXIT_FAILURE);
        }
-       sprintf(name,"%s.%s.%s.%s",n1,n2,n3,n4);
+       snprintf(name,name_size,"%s.%s.%s.%s",n1,n2,n3,n4);
+#endif
 
        return;
 }