diff options
author | B. Scott Michel <scooter.phd@gmail.com> | 2025-01-30 02:05:09 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2025-01-30 02:09:48 +0100 |
commit | 073dec073fa2efc471a61644b08c4396c0bef330 (patch) | |
tree | 241393b5ac7c409f3035683ad03fa701a36e2296 /src | |
parent | f032627c2569ca4e4b617906fb4d24e41eb86b54 (diff) | |
download | slirp-073dec073fa2efc471a61644b08c4396c0bef330.zip slirp-073dec073fa2efc471a61644b08c4396c0bef330.tar.gz slirp-073dec073fa2efc471a61644b08c4396c0bef330.tar.bz2 |
Provide stubs for inet_ntop() and inet_pton()
for Windows versions earlier than Windows 7.
Diffstat (limited to 'src')
-rw-r--r-- | src/util.c | 73 | ||||
-rw-r--r-- | src/util.h | 14 |
2 files changed, 82 insertions, 5 deletions
@@ -46,13 +46,76 @@ #if defined(_WIN32) int slirp_inet_aton(const char *cp, struct in_addr *ia) { - uint32_t addr = inet_addr(cp); - if (addr == 0xffffffff) { - return 0; + uint32_t addr; + int valid_addr; + +#if WINVER >= 0x0601 + valid_addr = inet_pton(AF_INET, cp, &addr) > 0; +#else + addr = inet_addr(cp); + valid_addr = (addr != 0xffffffff); +#endif + + if (valid_addr) { + ia->s_addr = addr; + return 1; + } + + /* Invalid address. */ + return 0; +} + +#if WINVER < 0x0601 +/* Something older than Windows 7 and TARGET_WINVER obviously was set. There + * are more than a few calls to inet_pton() and inet_ntop(), so provide suitable + * stubs with renames. */ + +int slirp_inet_pton(int af, const char *src, void *dst) +{ + struct sockaddr_storage ss; + int size = (int) sizeof(ss); + char src_copy[INET6_ADDRSTRLEN + 1]; + + ZeroMemory(&ss, sizeof(ss)); + strncpy (src_copy, src, INET6_ADDRSTRLEN); + src_copy[INET6_ADDRSTRLEN] = '\0'; + + if (WSAStringToAddress(src_copy, af, NULL, (struct sockaddr *)&ss, &size) == 0) { + switch(af) { + case AF_INET: + *((struct in_addr *) dst) = ((const struct sockaddr_in *) &ss)->sin_addr; + return 1; + case AF_INET6: + *((struct in6_addr *) dst) = ((const struct sockaddr_in6 *) &ss)->sin6_addr; + return 1; } - ia->s_addr = addr; - return 1; + } + + return 0; } + +const char *slirp_inet_ntop(int af, const void *src, char *dst, socklen_t size) +{ + struct sockaddr_storage ss; + DWORD s = (DWORD) size; + + ZeroMemory(&ss, sizeof(ss)); + ss.ss_family = af; + + switch(af) { + case AF_INET: + ((struct sockaddr_in *) &ss)->sin_addr = *((const struct in_addr *) src); + break; + case AF_INET6: + ((struct sockaddr_in6 *) &ss)->sin6_addr = *((const struct in6_addr *) src); + break; + default: + return NULL; + } + + return (WSAAddressToString((struct sockaddr *)&ss, sizeof(ss), NULL, dst, &s) == 0) ? dst : NULL; +} +#endif #endif @@ -196,6 +196,20 @@ int slirp_getsockopt_wrap(slirp_os_socket sockfd, int level, int optname, void * int slirp_setsockopt_wrap(slirp_os_socket sockfd, int level, int optname, const void *optval, int optlen); #define inet_aton slirp_inet_aton + +#if WINVER < 0x0601 +/* Windows versions older than Windows 7: */ + +#undef inet_pton +#undef inet_ntop + +#define inet_pton slirp_inet_pton +#define inet_ntop slirp_inet_ntop + +int slirp_inet_pton(int af, const char *src, void *dst); +const char *slirp_inet_ntop(int af, const void *src, char *dst, socklen_t size); +#endif + #else #define closesocket(s) close(s) #define ioctlsocket(s, r, v) ioctl(s, r, v) |