aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorB. Scott Michel <scooter.phd@gmail.com>2025-01-30 02:05:09 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2025-01-30 02:09:48 +0100
commit073dec073fa2efc471a61644b08c4396c0bef330 (patch)
tree241393b5ac7c409f3035683ad03fa701a36e2296 /src
parentf032627c2569ca4e4b617906fb4d24e41eb86b54 (diff)
downloadslirp-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.c73
-rw-r--r--src/util.h14
2 files changed, 82 insertions, 5 deletions
diff --git a/src/util.c b/src/util.c
index dfb0afb..eb302fb 100644
--- a/src/util.c
+++ b/src/util.c
@@ -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
diff --git a/src/util.h b/src/util.h
index 0d5a300..dafb64a 100644
--- a/src/util.h
+++ b/src/util.h
@@ -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)