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)
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
}
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);
}
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;
struct getwordstruct gwarea;
port=strchr(name,':');
- if (port) *port=0;
+ if (port) *port='\0';
if((hp=gethostbyname(name))==NULL)
return;
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;
}