|
17 | 17 | #undef inline |
18 | 18 | #define inline inline |
19 | 19 |
|
| 20 | +#include "winsock2.h" |
| 21 | +#include <Ws2tcpip.h> |
| 22 | + |
20 | 23 | // IIS7 Server API header file |
21 | 24 | #include <Windows.h> |
22 | 25 | #include <sal.h> |
|
30 | 33 | #include "api.h" |
31 | 34 | #include "moduleconfig.h" |
32 | 35 |
|
33 | | -#include "winsock2.h" |
34 | | - |
35 | 36 |
|
36 | 37 | class REQUEST_STORED_CONTEXT : public IHttpStoredContext |
37 | 38 | { |
@@ -90,63 +91,84 @@ class REQUEST_STORED_CONTEXT : public IHttpStoredContext |
90 | 91 |
|
91 | 92 | char *GetIpAddr(apr_pool_t *pool, PSOCKADDR pAddr) |
92 | 93 | { |
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) |
| 94 | + if (pAddr == NULL) { |
101 | 95 | return ""; |
| 96 | + } |
102 | 97 |
|
103 | | - buf[0] = 0; |
104 | | - |
105 | | - WSAAddressToString(pAddr, sizeof(SOCKADDR), NULL, buf, &len); |
| 98 | + char ipbuf[INET6_ADDRSTRLEN] = {0}; |
| 99 | + const char *res = ""; |
106 | 100 |
|
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; |
| 101 | + switch (pAddr->sa_family) { |
| 102 | + case AF_INET: |
| 103 | + { |
| 104 | + SOCKADDR_IN *sin = (SOCKADDR_IN *)pAddr; |
| 105 | + if (InetNtopA(AF_INET, &sin->sin_addr, ipbuf, sizeof(ipbuf)) != NULL) { |
| 106 | + res = (const char *)apr_pstrdup(pool, ipbuf); |
| 107 | + } else { |
| 108 | + res = ""; |
| 109 | + } |
| 110 | + } |
| 111 | + break; |
| 112 | + case AF_INET6: |
| 113 | + { |
| 114 | + SOCKADDR_IN6 *sin6 = (SOCKADDR_IN6 *)pAddr; |
| 115 | + if (InetNtopA(AF_INET6, &sin6->sin6_addr, ipbuf, sizeof(ipbuf)) != NULL) { |
| 116 | + res = (const char *)apr_pstrdup(pool, ipbuf); |
| 117 | + } else { |
| 118 | + res = ""; |
| 119 | + } |
| 120 | + } |
| 121 | + break; |
| 122 | + default: |
| 123 | + res = ""; |
| 124 | + break; |
113 | 125 | } |
114 | 126 |
|
115 | | - return buf; |
| 127 | + return (char *)res; |
116 | 128 | } |
117 | 129 |
|
118 | 130 | apr_sockaddr_t *CopySockAddr(apr_pool_t *pool, PSOCKADDR pAddr) |
119 | 131 | { |
120 | | - apr_sockaddr_t *addr = (apr_sockaddr_t *)apr_palloc(pool, sizeof(apr_sockaddr_t)); |
121 | | - int adrlen = 16, iplen = 4; |
| 132 | + apr_sockaddr_t *addr = (apr_sockaddr_t *)apr_palloc(pool, sizeof(apr_sockaddr_t)); |
122 | 133 |
|
123 | | - if(pAddr->sa_family == AF_INET6) |
124 | | - { |
125 | | - adrlen = 46; |
126 | | - iplen = 16; |
| 134 | + addr->pool = pool; |
| 135 | + addr->hostname = "unknown"; |
| 136 | + addr->servname = addr->hostname; |
| 137 | + addr->family = AF_UNSPEC; |
| 138 | + addr->addr_str_len = 0; |
| 139 | + addr->ipaddr_len = 0; |
| 140 | + addr->ipaddr_ptr = NULL; |
| 141 | + addr->salen = 0; |
| 142 | + addr->port = 0; |
| 143 | + |
| 144 | + if (pAddr == NULL) { |
| 145 | + return addr; |
127 | 146 | } |
128 | 147 |
|
129 | | - addr->addr_str_len = adrlen; |
130 | 148 | addr->family = pAddr->sa_family; |
131 | 149 |
|
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; |
| 150 | + if (pAddr->sa_family == AF_INET) { |
| 151 | + SOCKADDR_IN *sin = (SOCKADDR_IN *)pAddr; |
| 152 | + addr->addr_str_len = INET_ADDRSTRLEN; |
| 153 | + addr->ipaddr_len = sizeof(struct in_addr); |
| 154 | + addr->ipaddr_ptr = &addr->sa.sin.sin_addr; |
| 155 | + addr->sa.sin.sin_family = AF_INET; |
| 156 | + addr->sa.sin.sin_port = sin->sin_port; /* keep network byte order */ |
| 157 | + /* copy address */ |
| 158 | + memcpy(&addr->sa.sin.sin_addr, &sin->sin_addr, sizeof(struct in_addr)); |
| 159 | + addr->salen = sizeof(addr->sa); |
| 160 | + addr->port = ntohs(sin->sin_port); |
| 161 | + } else if (pAddr->sa_family == AF_INET6) { |
| 162 | + SOCKADDR_IN6 *sin6 = (SOCKADDR_IN6 *)pAddr; |
| 163 | + addr->addr_str_len = INET6_ADDRSTRLEN; |
| 164 | + addr->ipaddr_len = sizeof(struct in6_addr); |
| 165 | + addr->ipaddr_ptr = &addr->sa.sin6.sin6_addr; |
| 166 | + addr->sa.sin6.sin6_family = AF_INET6; |
| 167 | + addr->sa.sin6.sin6_port = sin6->sin6_port; |
| 168 | + memcpy(&addr->sa.sin6.sin6_addr, &sin6->sin6_addr, sizeof(struct in6_addr)); |
| 169 | + addr->salen = sizeof(addr->sa); |
| 170 | + addr->port = ntohs(sin6->sin6_port); |
| 171 | + } |
150 | 172 |
|
151 | 173 | return addr; |
152 | 174 | } |
|
0 commit comments