Skip to content

Commit 691617b

Browse files
committed
try to fix ipv6
1 parent e9a9850 commit 691617b

File tree

1 file changed

+67
-45
lines changed

1 file changed

+67
-45
lines changed

iis/mymodule.cpp

Lines changed: 67 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
#undef inline
1818
#define inline inline
1919

20+
#include "winsock2.h"
21+
#include <Ws2tcpip.h>
22+
2023
// IIS7 Server API header file
2124
#include <Windows.h>
2225
#include <sal.h>
@@ -30,8 +33,6 @@
3033
#include "api.h"
3134
#include "moduleconfig.h"
3235

33-
#include "winsock2.h"
34-
3536

3637
class REQUEST_STORED_CONTEXT : public IHttpStoredContext
3738
{
@@ -90,63 +91,84 @@ class REQUEST_STORED_CONTEXT : public IHttpStoredContext
9091

9192
char *GetIpAddr(apr_pool_t *pool, PSOCKADDR pAddr)
9293
{
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) {
10195
return "";
96+
}
10297

103-
buf[0] = 0;
104-
105-
WSAAddressToString(pAddr, sizeof(SOCKADDR), NULL, buf, &len);
98+
char ipbuf[INET6_ADDRSTRLEN] = {0};
99+
const char *res = "";
106100

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;
113125
}
114126

115-
return buf;
127+
return (char *)res;
116128
}
117129

118130
apr_sockaddr_t *CopySockAddr(apr_pool_t *pool, PSOCKADDR pAddr)
119131
{
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));
122133

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;
127146
}
128147

129-
addr->addr_str_len = adrlen;
130148
addr->family = pAddr->sa_family;
131149

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+
}
150172

151173
return addr;
152174
}

0 commit comments

Comments
 (0)