@@ -90,63 +90,66 @@ class REQUEST_STORED_CONTEXT : public IHttpStoredContext
9090
9191char *GetIpAddr (apr_pool_t *pool, PSOCKADDR pAddr)
9292{
93- const char *format = " %15[0-9.]:%5[0-9]" ;
94- char ip[16 ] = { 0 }; // ip4 addresses have max len 15
95- char port[6 ] = { 0 }; // port numbers are 16bit, ie 5 digits max
96-
97- DWORD len = 50 ;
98- char *buf = (char *)apr_palloc (pool, len);
99-
100- if (buf == NULL )
101- return " " ;
102-
103- buf[0 ] = 0 ;
104-
105- WSAAddressToString (pAddr, sizeof (SOCKADDR), NULL , buf, &len);
106-
107- // test for IPV4 with port on the end
108- if (sscanf (buf, format, ip, port) == 2 ) {
109- // IPV4 but with port - remove the port
110- char * input = " :" ;
111- char * ipv4 = strtok (buf, input);
112- return ipv4;
113- }
114-
115- return buf;
93+ if (pAddr == nullptr ) {
94+ return apr_pstrdup (pool, " " );
95+ }
96+
97+ DWORD addrSize = pAddr->sa_family == AF_INET ? sizeof (SOCKADDR_IN) : sizeof (SOCKADDR_IN6);
98+ auto buf = (char *)apr_palloc (pool, NI_MAXHOST);
99+ if (buf == nullptr ) {
100+ return apr_pstrdup (pool, " " );
101+ }
102+ buf[0 ] = ' \0 ' ;
103+
104+ if (GetNameInfo (pAddr, addrSize, buf, NI_MAXHOST, nullptr , 0 , NI_NUMERICHOST) != 0 ) {
105+ return apr_pstrdup (pool, " " );
106+ }
107+
108+ return buf;
116109}
117110
118111apr_sockaddr_t *CopySockAddr (apr_pool_t *pool, PSOCKADDR pAddr)
119112{
120- apr_sockaddr_t *addr = (apr_sockaddr_t *)apr_palloc (pool, sizeof (apr_sockaddr_t ));
121- int adrlen = 16 , iplen = 4 ;
113+ apr_sockaddr_t *addr = (apr_sockaddr_t *)apr_palloc (pool, sizeof (apr_sockaddr_t ));
122114
123- if (pAddr->sa_family == AF_INET6)
124- {
125- adrlen = 46 ;
126- iplen = 16 ;
115+ addr->pool = pool;
116+ addr->hostname = " unknown" ;
117+ addr->servname = addr->hostname ;
118+ addr->family = AF_UNSPEC;
119+ addr->addr_str_len = 0 ;
120+ addr->ipaddr_len = 0 ;
121+ addr->ipaddr_ptr = nullptr ;
122+ addr->salen = 0 ;
123+ addr->port = 0 ;
124+
125+ if (pAddr == nullptr ) {
126+ return addr;
127127 }
128128
129- addr->addr_str_len = adrlen;
130129 addr->family = pAddr->sa_family ;
131130
132- addr->hostname = " unknown" ;
133- #ifdef WIN32
134- addr->ipaddr_len = sizeof (IN_ADDR);
135- #else
136- addr->ipaddr_len = sizeof (struct in_addr );
137- #endif
138- addr->ipaddr_ptr = &addr->sa .sin .sin_addr ;
139- addr->pool = pool;
140- addr->port = 80 ;
141- #ifdef WIN32
142- memcpy (&addr->sa .sin .sin_addr .S_un .S_addr , pAddr->sa_data , iplen);
143- #else
144- memcpy (&addr->sa .sin .sin_addr .s_addr , pAddr->sa_data , iplen);
145- #endif
146- addr->sa .sin .sin_family = pAddr->sa_family ;
147- addr->sa .sin .sin_port = 80 ;
148- addr->salen = sizeof (addr->sa );
149- addr->servname = addr->hostname ;
131+ if (pAddr->sa_family == AF_INET) {
132+ auto sin = (SOCKADDR_IN *)pAddr;
133+ addr->addr_str_len = INET_ADDRSTRLEN;
134+ addr->ipaddr_len = sizeof (struct in_addr );
135+ addr->ipaddr_ptr = &addr->sa .sin .sin_addr ;
136+ addr->sa .sin .sin_family = AF_INET;
137+ addr->sa .sin .sin_port = sin->sin_port ; /* keep network byte order */
138+ /* copy address */
139+ memcpy (&addr->sa .sin .sin_addr , &sin->sin_addr , sizeof (struct in_addr ));
140+ addr->salen = sizeof (addr->sa );
141+ addr->port = ntohs (sin->sin_port );
142+ } else if (pAddr->sa_family == AF_INET6) {
143+ auto sin6 = (SOCKADDR_IN6 *)pAddr;
144+ addr->addr_str_len = INET6_ADDRSTRLEN;
145+ addr->ipaddr_len = sizeof (struct in6_addr );
146+ addr->ipaddr_ptr = &addr->sa .sin6 .sin6_addr ;
147+ addr->sa .sin6 .sin6_family = AF_INET6;
148+ addr->sa .sin6 .sin6_port = sin6->sin6_port ;
149+ memcpy (&addr->sa .sin6 .sin6_addr , &sin6->sin6_addr , sizeof (struct in6_addr ));
150+ addr->salen = sizeof (addr->sa );
151+ addr->port = ntohs (sin6->sin6_port );
152+ }
150153
151154 return addr;
152155}
0 commit comments