diff -Nrc mod_perl-1.30.orig/src/modules/perl/Connection.xs mod_perl-1.30/src/modules/perl/Connection.xs *** mod_perl-1.30.orig/src/modules/perl/Connection.xs Fri Mar 30 07:12:42 2007 --- mod_perl-1.30/src/modules/perl/Connection.xs Tue Jun 3 12:44:20 2008 *************** *** 23,30 **** # /* Who is the client? */ ! # struct sockaddr_in local_addr; /* local address */ ! # struct sockaddr_in remote_addr;/* remote address */ # char *remote_ip; /* Client's IP address */ # char *remote_host; /* Client's DNS name, if known. # * NULL if DNS hasn't been checked, --- 23,30 ---- # /* Who is the client? */ ! # struct sockaddr_storage local_addr; /* local address */ ! # struct sockaddr_storage remote_addr;/* remote address */ # char *remote_ip; /* Client's IP address */ # char *remote_host; /* Client's DNS name, if known. # * NULL if DNS hasn't been checked, *************** *** 78,84 **** RETVAL = newSVpv((char *)&conn->remote_addr, sizeof conn->remote_addr); if(sv_addr) { ! struct sockaddr_in addr; STRLEN sockaddrlen; char * new_addr = SvPV(sv_addr,sockaddrlen); if (sockaddrlen != sizeof(addr)) { --- 78,84 ---- RETVAL = newSVpv((char *)&conn->remote_addr, sizeof conn->remote_addr); if(sv_addr) { ! struct sockaddr_storage addr; STRLEN sockaddrlen; char * new_addr = SvPV(sv_addr,sockaddrlen); if (sockaddrlen != sizeof(addr)) { *************** *** 97,103 **** CODE: RETVAL = conn->remote_ip; ! if(items > 1) { #ifdef SGI_BOOST ap_cpystrn(conn->remote_ip, (char *)SvPV(ST(1),na), --- 97,105 ---- CODE: RETVAL = conn->remote_ip; ! ! struct addrinfo hints, *res, *res0; ! int error; if(items > 1) { #ifdef SGI_BOOST ap_cpystrn(conn->remote_ip, (char *)SvPV(ST(1),na), *************** *** 106,112 **** #else conn->remote_ip = pstrdup(conn->pool, (char *)SvPV(ST(1),na)); #endif ! conn->remote_addr.sin_addr.s_addr = inet_addr(conn->remote_ip); } OUTPUT: --- 108,125 ---- #else conn->remote_ip = pstrdup(conn->pool, (char *)SvPV(ST(1),na)); #endif ! memset(&hints, 0, sizeof(hints)); ! hints.ai_family = PF_UNSPEC; ! hints.ai_socktype = SOCK_STREAM; ! error = getaddrinfo(conn->remote_ip, NULL, &hints, &res0); ! if (!error) { ! memcpy(&conn->remote_addr, (const void *)res0->ai_addr, ! (size_t) res0->ai_addrlen); ! freeaddrinfo(res0); ! } else { ! croak("Bad IP address in remote_ip getaddrinfo failed %s", ! gai_strerror(error)); ! } } OUTPUT: