From 4afbb7a56661c61dca4d781c17c85f0295e2d6c7 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fr=C3=A9d=C3=A9ric=20Marchal?= Date: Fri, 21 Jan 2011 15:56:05 +0000 Subject: [PATCH] Resolve IPv6 addresses when creating the datafile 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 | 3 ++- configure.in | 1 + datafile.c | 2 +- include/config.h.in | 1 + include/defs.h | 2 +- include/info.h | 2 +- ip2name.c | 52 ++++++++++++++++++++++++++++++++++++++++++--- 7 files changed, 56 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c6402ab..9c38d04 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 diff --git a/configure.in b/configure.in index f0b5c6c..ee812d6 100644 --- a/configure.in +++ b/configure.in @@ -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 diff --git a/datafile.c b/datafile.c index 1b14fea..9b57931 100644 --- a/datafile.c +++ b/datafile.c @@ -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); } diff --git a/include/config.h.in b/include/config.h.in index 0dbe838..ccfa37e 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -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@" diff --git a/include/defs.h b/include/defs.h index 9892c84..97a9950 100755 --- a/include/defs.h +++ b/include/defs.h @@ -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); diff --git a/include/info.h b/include/info.h index 24b659d..32ba2d2 100755 --- a/include/info.h +++ b/include/info.h @@ -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" diff --git a/ip2name.c b/ip2name.c index 066c596..ad1e6e5 100644 --- 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_addrlenai_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_addrlenai_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; } -- 2.39.2