1717#undef inline
1818#define inline inline
1919
20- #include " winsock2.h"
21-
2220// IIS7 Server API header file
2321#include < Windows.h>
2422#include < sal.h>
3230#include " api.h"
3331#include " moduleconfig.h"
3432
33+ #include " winsock2.h"
34+
3535
3636class REQUEST_STORED_CONTEXT : public IHttpStoredContext
3737{
@@ -90,66 +90,63 @@ class REQUEST_STORED_CONTEXT : public IHttpStoredContext
9090
9191char *GetIpAddr (apr_pool_t *pool, PSOCKADDR pAddr)
9292{
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;
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;
109116}
110117
111118apr_sockaddr_t *CopySockAddr (apr_pool_t *pool, PSOCKADDR pAddr)
112119{
113- apr_sockaddr_t *addr = (apr_sockaddr_t *)apr_palloc (pool, sizeof (apr_sockaddr_t ));
120+ apr_sockaddr_t *addr = (apr_sockaddr_t *)apr_palloc (pool, sizeof (apr_sockaddr_t ));
121+ int adrlen = 16 , iplen = 4 ;
114122
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;
123+ if (pAddr->sa_family == AF_INET6)
124+ {
125+ adrlen = 46 ;
126+ iplen = 16 ;
127127 }
128128
129+ addr->addr_str_len = adrlen;
129130 addr->family = pAddr->sa_family ;
130131
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- }
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 ;
153150
154151 return addr;
155152}
@@ -1324,4 +1321,4 @@ BOOL CMyHttpModule::WriteEventViewerLog(LPCSTR szNotification, WORD category)
13241321 NULL , 1 , 0 , &szNotification, NULL );
13251322 }
13261323 return FALSE ;
1327- }
1324+ }
0 commit comments