aboutsummaryrefslogtreecommitdiff
path: root/src/platform
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform')
-rw-r--r--src/platform/posix/CMakeLists.txt1
-rw-r--r--src/platform/posix/posix_resolv_gai.c49
-rw-r--r--src/platform/posix/posix_sockaddr.c48
-rw-r--r--src/platform/posix/posix_tcpdial.c28
-rw-r--r--src/platform/posix/posix_tcplisten.c15
-rw-r--r--src/platform/resolver_test.c56
-rw-r--r--src/platform/windows/win_resolv.c43
-rw-r--r--src/platform/windows/win_sockaddr.c14
-rw-r--r--src/platform/windows/win_tcpdial.c26
9 files changed, 207 insertions, 73 deletions
diff --git a/src/platform/posix/CMakeLists.txt b/src/platform/posix/CMakeLists.txt
index b8e3782e..a00ffa50 100644
--- a/src/platform/posix/CMakeLists.txt
+++ b/src/platform/posix/CMakeLists.txt
@@ -62,6 +62,7 @@ if (NNG_PLATFORM_POSIX)
nng_check_sym(getpeerucred ucred.h NNG_HAVE_GETPEERUCRED)
nng_check_sym(atomic_flag_test_and_set stdatomic.h NNG_HAVE_STDATOMIC)
nng_check_sym(socketpair sys/socket.h NNG_HAVE_SOCKETPAIR)
+ nng_check_sym(AF_INET6 netinet/in.h NNG_HAVE_INET6)
nng_sources(
posix_impl.h
diff --git a/src/platform/posix/posix_resolv_gai.c b/src/platform/posix/posix_resolv_gai.c
index 8eaa29f2..f522499e 100644
--- a/src/platform/posix/posix_resolv_gai.c
+++ b/src/platform/posix/posix_resolv_gai.c
@@ -33,6 +33,10 @@
#define AI_NUMERICSERV 0
#endif
+#ifndef NNG_HAVE_INET6
+#undef NNG_ENABLE_IPV6
+#endif
+
static nni_mtx resolv_mtx = NNI_MTX_INITIALIZER;
static nni_cv resolv_cv = NNI_CV_INITIALIZER(&resolv_mtx);
static bool resolv_fini = false;
@@ -182,17 +186,23 @@ resolv_task(resolv_item *item)
rv = NNG_EADDRINVAL;
for (probe = results; probe != NULL; probe = probe->ai_next) {
- if ((probe->ai_addr->sa_family == AF_INET) ||
- (probe->ai_addr->sa_family == AF_INET6)) {
+ if (probe->ai_addr->sa_family == AF_INET) {
break;
}
+#ifdef NNG_ENABLE_IPV6
+ if (probe->ai_addr->sa_family == AF_INET6) {
+ break;
+ }
+#endif
}
nni_mtx_lock(&resolv_mtx);
if ((probe != NULL) && (item->aio != NULL)) {
- struct sockaddr_in *sin;
+ struct sockaddr_in *sin;
+#ifdef NNG_ENABLE_IPV6
struct sockaddr_in6 *sin6;
- nng_sockaddr *sa = item->sa;
+#endif
+ nng_sockaddr *sa = item->sa;
switch (probe->ai_addr->sa_family) {
case AF_INET:
@@ -202,6 +212,7 @@ resolv_task(resolv_item *item)
sa->s_in.sa_port = sin->sin_port;
sa->s_in.sa_addr = sin->sin_addr.s_addr;
break;
+#ifdef NNG_ENABLE_IPV6
case AF_INET6:
rv = 0;
sin6 = (void *) probe->ai_addr;
@@ -210,6 +221,7 @@ resolv_task(resolv_item *item)
sa->s_in6.sa_scope = sin6->sin6_scope_id;
memcpy(sa->s_in6.sa_addr, sin6->sin6_addr.s6_addr, 16);
break;
+#endif
}
}
nni_mtx_unlock(&resolv_mtx);
@@ -238,12 +250,20 @@ nni_resolv_ip(const char *host, const char *serv, int af, bool passive,
case NNG_AF_INET:
fam = AF_INET;
break;
+
+#ifdef NNG_ENABLE_IPV6
case NNG_AF_INET6:
fam = AF_INET6;
break;
case NNG_AF_UNSPEC:
fam = AF_UNSPEC;
break;
+#else
+ case NNG_AF_UNSPEC:
+ fam = AF_INET;
+ break;
+#endif
+
default:
nni_aio_finish_error(aio, NNG_ENOTSUP);
return;
@@ -342,13 +362,17 @@ parse_ip(const char *addr, nng_sockaddr *sa, bool want_port)
struct addrinfo hints;
struct addrinfo *results;
int rv;
- bool v6 = false;
- bool wrapped = false;
char *port;
char *host;
char *buf;
size_t buf_len;
+#ifdef NNG_ENABLE_IPV6
+ bool v6 = false;
+ bool wrapped = false;
+ char *s;
+#endif
+
if (addr == NULL) {
addr = "";
}
@@ -359,12 +383,12 @@ parse_ip(const char *addr, nng_sockaddr *sa, bool want_port)
}
memcpy(buf, addr, buf_len);
host = buf;
+#ifdef NNG_ENABLE_IPV6
if (*host == '[') {
v6 = true;
wrapped = true;
host++;
} else {
- char *s;
for (s = host; *s != '\0'; s++) {
if (*s == '.') {
break;
@@ -394,6 +418,13 @@ parse_ip(const char *addr, nng_sockaddr *sa, bool want_port)
rv = NNG_EADDRINVAL;
goto done;
}
+#else // NNG_ENABLE_IPV6
+ for (port = host; *port != '\0'; port++) {
+ if (*port == ':') {
+ break;
+ }
+ }
+#endif // NNG_ENABLE_IPV6
if ((!want_port) && (*port != '\0')) {
rv = NNG_EADDRINVAL;
@@ -408,9 +439,13 @@ parse_ip(const char *addr, nng_sockaddr *sa, bool want_port)
memset(&hints, 0, sizeof(hints));
hints.ai_flags = AI_NUMERICSERV | AI_NUMERICHOST | AI_PASSIVE;
+#ifdef NNG_ENABLE_IPV6
if (v6) {
hints.ai_family = AF_INET6;
}
+#else
+ hints.ai_family = AF_INET;
+#endif
#ifdef AI_ADDRCONFIG
hints.ai_flags |= AI_ADDRCONFIG;
#endif
diff --git a/src/platform/posix/posix_sockaddr.c b/src/platform/posix/posix_sockaddr.c
index a569132c..63707310 100644
--- a/src/platform/posix/posix_sockaddr.c
+++ b/src/platform/posix/posix_sockaddr.c
@@ -1,5 +1,5 @@
//
-// Copyright 2020 Staysail Systems, Inc. <info@staysail.tech>
+// Copyright 2024 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
@@ -22,17 +22,23 @@
#include <sys/types.h>
#include <sys/un.h>
+#ifndef NNG_HAVE_INET6
+#undef NNG_ENABLE_IPV6
+#endif
+
size_t
nni_posix_nn2sockaddr(void *sa, const nni_sockaddr *na)
{
- struct sockaddr_in * sin;
- struct sockaddr_in6 * sin6;
- struct sockaddr_un * spath;
- const nng_sockaddr_in * nsin;
- const nng_sockaddr_in6 * nsin6;
- const nng_sockaddr_path * nspath;
+ struct sockaddr_in *sin;
+ struct sockaddr_un *spath;
+ const nng_sockaddr_in *nsin;
+ const nng_sockaddr_path *nspath;
const nng_sockaddr_abstract *nsabs;
size_t sz;
+#ifdef NNG_ENABLE_IPV6
+ struct sockaddr_in6 *sin6;
+ const nng_sockaddr_in6 *nsin6;
+#endif
if ((sa == NULL) || (na == NULL)) {
return (0);
@@ -47,6 +53,7 @@ nni_posix_nn2sockaddr(void *sa, const nni_sockaddr *na)
sin->sin_addr.s_addr = nsin->sa_addr;
return (sizeof(*sin));
+#ifdef NNG_ENABLE_IPV6
case NNG_AF_INET6:
sin6 = (void *) sa;
nsin6 = &na->s_in6;
@@ -59,6 +66,7 @@ nni_posix_nn2sockaddr(void *sa, const nni_sockaddr *na)
sin6->sin6_scope_id = nsin6->sa_scope;
memcpy(sin6->sin6_addr.s6_addr, nsin6->sa_addr, 16);
return (sizeof(*sin6));
+#endif
case NNG_AF_IPC:
spath = (void *) sa;
@@ -75,18 +83,18 @@ nni_posix_nn2sockaddr(void *sa, const nni_sockaddr *na)
case NNG_AF_ABSTRACT:
spath = (void *) sa;
nsabs = &na->s_abstract;
- if (nsabs->sa_len >= sizeof (spath->sun_path)) {
+ if (nsabs->sa_len >= sizeof(spath->sun_path)) {
return (0);
}
memset(spath, 0, sizeof(*spath));
- spath->sun_family = PF_UNIX;
+ spath->sun_family = PF_UNIX;
spath->sun_path[0] = '\0'; // abstract starts with nul
// We support auto-bind with an empty string. There is
// a subtle caveat here, which is that we cannot bind to
// the *empty* name.
if (nsabs->sa_len == 0) {
- return (sizeof (sa_family_t)); // auto bind
+ return (sizeof(sa_family_t)); // auto bind
} else {
memcpy(&spath->sun_path[1], nsabs->sa_name,
nsabs->sa_len);
@@ -99,13 +107,15 @@ nni_posix_nn2sockaddr(void *sa, const nni_sockaddr *na)
int
nni_posix_sockaddr2nn(nni_sockaddr *na, const void *sa, size_t sz)
{
- const struct sockaddr_in * sin;
+ const struct sockaddr_in *sin;
+ const struct sockaddr_un *spath;
+ nng_sockaddr_in *nsin;
+ nng_sockaddr_path *nspath;
+ nng_sockaddr_abstract *nsabs;
+#ifdef NNG_ENABLE_IPV6
const struct sockaddr_in6 *sin6;
- const struct sockaddr_un * spath;
- nng_sockaddr_in * nsin;
- nng_sockaddr_in6 * nsin6;
- nng_sockaddr_path * nspath;
- nng_sockaddr_abstract * nsabs;
+ nng_sockaddr_in6 *nsin6;
+#endif
if ((na == NULL) || (sa == NULL)) {
return (-1);
@@ -121,6 +131,8 @@ nni_posix_sockaddr2nn(nni_sockaddr *na, const void *sa, size_t sz)
nsin->sa_port = sin->sin_port;
nsin->sa_addr = sin->sin_addr.s_addr;
break;
+
+#ifdef NNG_ENABLE_IPV6
case AF_INET6:
if (sz < sizeof(*sin6)) {
return (-1);
@@ -132,6 +144,8 @@ nni_posix_sockaddr2nn(nni_sockaddr *na, const void *sa, size_t sz)
nsin6->sa_scope = sin6->sin6_scope_id;
memcpy(nsin6->sa_addr, sin6->sin6_addr.s6_addr, 16);
break;
+#endif
+
case AF_UNIX:
// AF_UNIX can be NNG_AF_IPC, or NNG_AF_ABSTRACT.
spath = (void *) sa;
@@ -153,7 +167,7 @@ nni_posix_sockaddr2nn(nni_sockaddr *na, const void *sa, size_t sz)
nsabs->sa_len = sz - 1;
memcpy(nsabs->sa_name, &spath->sun_path[1], sz - 1);
} else {
- nspath = &na->s_ipc;
+ nspath = &na->s_ipc;
nspath->sa_family = NNG_AF_IPC;
nni_strlcpy(nspath->sa_path, spath->sun_path,
sizeof(nspath->sa_path));
diff --git a/src/platform/posix/posix_tcpdial.c b/src/platform/posix/posix_tcpdial.c
index 0af72cfa..cf3d9368 100644
--- a/src/platform/posix/posix_tcpdial.c
+++ b/src/platform/posix/posix_tcpdial.c
@@ -1,5 +1,5 @@
//
-// Copyright 2023 Staysail Systems, Inc. <info@staysail.tech>
+// Copyright 2024 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
// Copyright 2018 Devolutions <info@devolutions.net>
//
@@ -23,6 +23,10 @@
#include "posix_tcp.h"
+#ifndef NNG_HAVE_INET6
+#undef NNG_ENABLE_IPV6
+#endif
+
// Dialer stuff.
int
nni_tcp_dialer_init(nni_tcp_dialer **dp)
@@ -93,7 +97,7 @@ static void
tcp_dialer_cancel(nni_aio *aio, void *arg, int rv)
{
nni_tcp_dialer *d = arg;
- nni_tcp_conn * c;
+ nni_tcp_conn *c;
nni_mtx_lock(&d->mtx);
if ((!nni_aio_list_active(aio)) ||
@@ -113,9 +117,9 @@ tcp_dialer_cancel(nni_aio *aio, void *arg, int rv)
static void
tcp_dialer_cb(nni_posix_pfd *pfd, unsigned ev, void *arg)
{
- nni_tcp_conn * c = arg;
+ nni_tcp_conn *c = arg;
nni_tcp_dialer *d = c->dialer;
- nni_aio * aio;
+ nni_aio *aio;
int rv;
int ka;
int nd;
@@ -171,8 +175,8 @@ tcp_dialer_cb(nni_posix_pfd *pfd, unsigned ev, void *arg)
void
nni_tcp_dial(nni_tcp_dialer *d, const nni_sockaddr *sa, nni_aio *aio)
{
- nni_tcp_conn * c;
- nni_posix_pfd * pfd = NULL;
+ nni_tcp_conn *c;
+ nni_posix_pfd *pfd = NULL;
struct sockaddr_storage ss;
size_t sslen;
int fd;
@@ -333,13 +337,15 @@ tcp_dialer_get_locaddr(void *arg, void *buf, size_t *szp, nni_type t)
static int
tcp_dialer_set_locaddr(void *arg, const void *buf, size_t sz, nni_type t)
{
- nni_tcp_dialer * d = arg;
+ nni_tcp_dialer *d = arg;
nng_sockaddr sa;
struct sockaddr_storage ss;
- struct sockaddr_in * sin;
- struct sockaddr_in6 * sin6;
+ struct sockaddr_in *sin;
size_t len;
int rv;
+#ifdef NNG_ENABLE_IPV6
+ struct sockaddr_in6 *sin6;
+#endif
if ((rv = nni_copyin_sockaddr(&sa, buf, sz, t)) != 0) {
return (rv);
@@ -356,12 +362,16 @@ tcp_dialer_set_locaddr(void *arg, const void *buf, size_t sz, nni_type t)
return (NNG_EADDRINVAL);
}
break;
+
+#ifdef NNG_ENABLE_IPV6
case AF_INET6:
sin6 = (void *) &ss;
if (sin6->sin6_port != 0) {
return (NNG_EADDRINVAL);
}
break;
+#endif // __NG_INET6
+
default:
return (NNG_EADDRINVAL);
}
diff --git a/src/platform/posix/posix_tcplisten.c b/src/platform/posix/posix_tcplisten.c
index e1c0b90c..95be4beb 100644
--- a/src/platform/posix/posix_tcplisten.c
+++ b/src/platform/posix/posix_tcplisten.c
@@ -27,6 +27,10 @@
#define SOCK_CLOEXEC 0
#endif
+#ifndef NNG_HAVE_INET6
+#undef NNG_ENABLE_IPV6
+#endif
+
#include "posix_tcp.h"
struct nni_tcp_listener {
@@ -94,7 +98,7 @@ tcp_listener_doaccept(nni_tcp_listener *l)
int nd;
int ka;
nni_posix_pfd *pfd;
- nni_tcp_conn * c;
+ nni_tcp_conn *c;
fd = nni_posix_pfd_fd(l->pfd);
@@ -203,10 +207,15 @@ nni_tcp_listener_listen(nni_tcp_listener *l, const nni_sockaddr *sa)
struct sockaddr_storage ss;
int rv;
int fd;
- nni_posix_pfd * pfd;
+ nni_posix_pfd *pfd;
if (((len = nni_posix_nn2sockaddr(&ss, sa)) == 0) ||
- ((ss.ss_family != AF_INET) && (ss.ss_family != AF_INET6))) {
+#ifdef NNG_ENABLE_IPV6
+ ((ss.ss_family != AF_INET) && (ss.ss_family != AF_INET6))
+#else
+ (ss.ss_family != AF_INET)
+#endif
+ ) {
return (NNG_EADDRINVAL);
}
diff --git a/src/platform/resolver_test.c b/src/platform/resolver_test.c
index d4dd4465..ed88d09d 100644
--- a/src/platform/resolver_test.c
+++ b/src/platform/resolver_test.c
@@ -1,5 +1,5 @@
//
-// Copyright 2020 Staysail Systems, Inc. <info@staysail.tech>
+// Copyright 2024 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
@@ -12,12 +12,33 @@
#include <nuts.h>
+#ifdef NNG_ENABLE_IPV6
uint8_t v6loop[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };
+static bool
+has_v6(void)
+{
+ nng_sockaddr sa;
+ nni_plat_udp *u;
+ int rv;
+
+ nni_init(); // ensure that platform poller is up
+ sa.s_in6.sa_family = NNG_AF_INET6;
+ sa.s_in6.sa_port = 0;
+ memcpy(sa.s_in6.sa_addr, v6loop, 16);
+
+ rv = nni_plat_udp_open(&u, &sa);
+ if (rv == 0) {
+ nni_plat_udp_close(u);
+ }
+ return (rv == 0);
+}
+#endif
+
void
test_google_dns(void)
{
- nng_aio * aio;
+ nng_aio *aio;
nng_sockaddr sa;
NUTS_PASS(nng_aio_alloc(&aio, NULL, NULL));
@@ -34,7 +55,7 @@ test_google_dns(void)
void
test_numeric_addr(void)
{
- nng_aio * aio;
+ nng_aio *aio;
nng_sockaddr sa;
NUTS_PASS(nng_aio_alloc(&aio, NULL, NULL));
@@ -47,19 +68,17 @@ test_numeric_addr(void)
nng_aio_free(aio);
}
+#ifdef NNG_ENABLE_IPV6
void
test_numeric_v6(void)
{
- nng_aio * aio;
+ nng_aio *aio;
nng_sockaddr sa;
- // Travis CI has moved some of their services to host that
- // apparently don't support IPv6 at all. This is very sad.
- // CircleCI 2.0 is in the same boat. (Amazon to blame.)
- if ((getenv("TRAVIS") != NULL) || (getenv("CIRCLECI") != NULL)) {
- return; // skip this one.
+ if (!has_v6()) {
+ return;
}
-
+ NUTS_MSG("IPV6 support present");
NUTS_PASS(nng_aio_alloc(&aio, NULL, NULL));
nni_resolv_ip("::1", "80", NNG_AF_INET6, true, &sa, aio);
nng_aio_wait(aio);
@@ -69,11 +88,12 @@ test_numeric_v6(void)
NUTS_TRUE(memcmp(sa.s_in6.sa_addr, v6loop, 16) == 0);
nng_aio_free(aio);
}
+#endif
void
test_service_names(void)
{
- nng_aio * aio;
+ nng_aio *aio;
nng_sockaddr sa;
NUTS_PASS(nng_aio_alloc(&aio, NULL, NULL));
@@ -88,7 +108,7 @@ test_service_names(void)
void
test_localhost_v4(void)
{
- nng_aio * aio;
+ nng_aio *aio;
nng_sockaddr sa;
NUTS_PASS(nng_aio_alloc(&aio, NULL, NULL));
@@ -104,7 +124,7 @@ test_localhost_v4(void)
void
test_localhost_unspecified(void)
{
- nng_aio * aio;
+ nng_aio *aio;
nng_sockaddr sa;
NUTS_PASS(nng_aio_alloc(&aio, NULL, NULL));
@@ -118,10 +138,12 @@ test_localhost_unspecified(void)
NUTS_TRUE(sa.s_in.sa_port == nuts_be16(80));
NUTS_TRUE(sa.s_in.sa_addr == nuts_be32(0x7f000001));
break;
+#ifdef NNG_ENABLE_IPV6
case NNG_AF_INET6:
NUTS_TRUE(sa.s_in6.sa_port == nuts_be16(80));
NUTS_TRUE(memcmp(sa.s_in6.sa_addr, v6loop, 16) == 0);
break;
+#endif
}
nng_aio_free(aio);
}
@@ -129,7 +151,7 @@ test_localhost_unspecified(void)
void
test_null_passive(void)
{
- nng_aio * aio;
+ nng_aio *aio;
nng_sockaddr sa;
NUTS_PASS(nng_aio_alloc(&aio, NULL, NULL));
@@ -145,7 +167,7 @@ test_null_passive(void)
void
test_null_not_passive(void)
{
- nng_aio * aio;
+ nng_aio *aio;
nng_sockaddr sa;
NUTS_PASS(nng_aio_alloc(&aio, NULL, NULL));
@@ -166,7 +188,7 @@ test_null_not_passive(void)
void
test_bad_port_number(void)
{
- nng_aio * aio;
+ nng_aio *aio;
nng_sockaddr sa;
NUTS_PASS(nng_aio_alloc(&aio, NULL, NULL));
@@ -179,7 +201,9 @@ test_bad_port_number(void)
NUTS_TESTS = {
{ "resolve google dns", test_google_dns },
{ "resolve numeric addr", test_numeric_addr },
+#ifdef NNG_ENABLE_IPV6
{ "resolve numeric v6", test_numeric_v6 },
+#endif
{ "resolve service names", test_service_names },
{ "resolve localhost v4", test_localhost_v4 },
{ "resolve localhost unspecified", test_localhost_unspecified },
diff --git a/src/platform/windows/win_resolv.c b/src/platform/windows/win_resolv.c
index 92c7461f..4f353e08 100644
--- a/src/platform/windows/win_resolv.c
+++ b/src/platform/windows/win_resolv.c
@@ -148,17 +148,23 @@ resolv_task(resolv_item *item)
rv = NNG_EADDRINVAL;
for (probe = results; probe != NULL; probe = probe->ai_next) {
- if ((probe->ai_addr->sa_family == AF_INET) ||
- (probe->ai_addr->sa_family == AF_INET6)) {
+ if (probe->ai_addr->sa_family == AF_INET) {
break;
}
+#if NNG_ENABLE_IPV6
+ if (probe->ai_addr->sa_family == AF_INET6) {
+ break;
+ }
+#endif
}
nni_mtx_lock(&resolv_mtx);
if ((probe != NULL) && (item->aio != NULL)) {
- struct sockaddr_in *sin;
+ struct sockaddr_in *sin;
+#ifdef NNG_ENABLE_IPV6
struct sockaddr_in6 *sin6;
- nni_sockaddr *sa;
+#endif
+ nni_sockaddr *sa;
sa = item->sa;
@@ -170,6 +176,7 @@ resolv_task(resolv_item *item)
sa->s_in.sa_port = sin->sin_port;
sa->s_in.sa_addr = sin->sin_addr.s_addr;
break;
+#ifdef NNG_ENABLE_IPV6
case AF_INET6:
rv = 0;
sin6 = (void *) probe->ai_addr;
@@ -178,6 +185,7 @@ resolv_task(resolv_item *item)
sa->s_in6.sa_scope = sin6->sin6_scope_id;
memcpy(sa->s_in6.sa_addr, sin6->sin6_addr.s6_addr, 16);
break;
+#endif
}
}
nni_mtx_unlock(&resolv_mtx);
@@ -205,12 +213,18 @@ nni_resolv_ip(const char *host, const char *serv, int family, bool passive,
case NNG_AF_INET:
fam = AF_INET;
break;
+#ifdef NNG_ENABLE_IPV6
case NNG_AF_INET6:
fam = AF_INET6;
break;
case NNG_AF_UNSPEC:
fam = AF_UNSPEC;
break;
+#else
+ case NNG_AF_UNSPEC:
+ fam = AF_INET;
+ break;
+#endif
default:
nni_aio_finish_error(aio, NNG_ENOTSUP);
return;
@@ -306,12 +320,15 @@ parse_ip(const char *addr, nng_sockaddr *sa, bool want_port)
struct addrinfo hints;
struct addrinfo *results;
int rv;
- bool v6 = false;
- bool wrapped = false;
char *port;
char *host;
char *buf;
size_t buf_len;
+#ifdef NNG_ENABLE_IPV6
+ bool v6 = false;
+ bool wrapped = false;
+ char *s;
+#endif
if (addr == NULL) {
addr = "";
@@ -323,12 +340,13 @@ parse_ip(const char *addr, nng_sockaddr *sa, bool want_port)
}
memcpy(buf, addr, buf_len);
host = buf;
+
+#ifdef NNG_ENABLE_IPV6
if (*host == '[') {
v6 = true;
wrapped = true;
host++;
} else {
- char *s;
for (s = host; *s != '\0'; s++) {
if (*s == '.') {
break;
@@ -358,6 +376,13 @@ parse_ip(const char *addr, nng_sockaddr *sa, bool want_port)
rv = NNG_EADDRINVAL;
goto done;
}
+#else // NNG_ENABLE_IPV6
+ for (port = host; *port != '\0'; port++) {
+ if (*port == ':') {
+ break;
+ }
+ }
+#endif
if ((!want_port) && (*port != '\0')) {
rv = NNG_EADDRINVAL;
@@ -373,9 +398,13 @@ parse_ip(const char *addr, nng_sockaddr *sa, bool want_port)
memset(&hints, 0, sizeof(hints));
hints.ai_flags =
AI_ADDRCONFIG | AI_NUMERICSERV | AI_NUMERICHOST | AI_PASSIVE;
+#ifdef NNG_ENABLE_IPV6
if (v6) {
hints.ai_family = AF_INET6;
}
+#else
+ hints.ai_family = AF_INET;
+#endif
rv = getaddrinfo(host, port, &hints, &results);
if ((rv != 0) || (results == NULL)) {
diff --git a/src/platform/windows/win_sockaddr.c b/src/platform/windows/win_sockaddr.c
index 818f670b..585096e9 100644
--- a/src/platform/windows/win_sockaddr.c
+++ b/src/platform/windows/win_sockaddr.c
@@ -1,5 +1,5 @@
//
-// Copyright 2020 Staysail Systems, Inc. <info@staysail.tech>
+// Copyright 2024 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
@@ -15,8 +15,10 @@
int
nni_win_nn2sockaddr(SOCKADDR_STORAGE *ss, const nni_sockaddr *sa)
{
- SOCKADDR_IN * sin;
+ SOCKADDR_IN *sin;
+#ifdef NNG_ENABLE_IPV6
SOCKADDR_IN6 *sin6;
+#endif
if ((ss == NULL) || (sa == NULL)) {
return (-1);
@@ -30,6 +32,7 @@ nni_win_nn2sockaddr(SOCKADDR_STORAGE *ss, const nni_sockaddr *sa)
sin->sin_addr.s_addr = sa->s_in.sa_addr;
return (sizeof(*sin));
+#ifdef NNG_ENABLE_IPV6
case NNG_AF_INET6:
sin6 = (void *) ss;
memset(sin6, 0, sizeof(*sin6));
@@ -38,6 +41,7 @@ nni_win_nn2sockaddr(SOCKADDR_STORAGE *ss, const nni_sockaddr *sa)
sin6->sin6_scope_id = sa->s_in6.sa_scope;
memcpy(sin6->sin6_addr.s6_addr, sa->s_in6.sa_addr, 16);
return (sizeof(*sin6));
+#endif
}
return (-1);
}
@@ -45,8 +49,10 @@ nni_win_nn2sockaddr(SOCKADDR_STORAGE *ss, const nni_sockaddr *sa)
int
nni_win_sockaddr2nn(nni_sockaddr *sa, const SOCKADDR_STORAGE *ss)
{
- SOCKADDR_IN * sin;
+ SOCKADDR_IN *sin;
+#ifdef NNG_ENABLE_IPV6
SOCKADDR_IN6 *sin6;
+#endif
if ((ss == NULL) || (sa == NULL)) {
return (-1);
@@ -59,6 +65,7 @@ nni_win_sockaddr2nn(nni_sockaddr *sa, const SOCKADDR_STORAGE *ss)
sa->s_in.sa_addr = sin->sin_addr.s_addr;
return (0);
+#ifdef NNG_ENABLE_IPV6
case PF_INET6:
sin6 = (void *) ss;
sa->s_in6.sa_family = NNG_AF_INET6;
@@ -66,6 +73,7 @@ nni_win_sockaddr2nn(nni_sockaddr *sa, const SOCKADDR_STORAGE *ss)
sa->s_in6.sa_scope = sin6->sin6_scope_id;
memcpy(sa->s_in6.sa_addr, sin6->sin6_addr.s6_addr, 16);
return (0);
+#endif
}
return (-1);
}
diff --git a/src/platform/windows/win_tcpdial.c b/src/platform/windows/win_tcpdial.c
index 9463c241..b4a6d745 100644
--- a/src/platform/windows/win_tcpdial.c
+++ b/src/platform/windows/win_tcpdial.c
@@ -1,5 +1,5 @@
//
-// Copyright 2020 Staysail Systems, Inc. <info@staysail.tech>
+// Copyright 2024 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
// Copyright 2018 Devolutions <info@devolutions.net>
//
@@ -113,7 +113,7 @@ static void
tcp_dial_cancel(nni_aio *aio, void *arg, int rv)
{
nni_tcp_dialer *d = arg;
- nni_tcp_conn * c;
+ nni_tcp_conn *c;
nni_mtx_lock(&d->mtx);
if ((c = nni_aio_get_prov_data(aio)) != NULL) {
@@ -128,9 +128,9 @@ tcp_dial_cancel(nni_aio *aio, void *arg, int rv)
static void
tcp_dial_cb(nni_win_io *io, int rv, size_t cnt)
{
- nni_tcp_conn * c = io->ptr;
+ nni_tcp_conn *c = io->ptr;
nni_tcp_dialer *d = c->dialer;
- nni_aio * aio = c->conn_aio;
+ nni_aio *aio = c->conn_aio;
BOOL ka;
BOOL nd;
@@ -183,7 +183,7 @@ nni_tcp_dial(nni_tcp_dialer *d, const nni_sockaddr *sa, nni_aio *aio)
SOCKET s;
SOCKADDR_STORAGE ss;
int len;
- nni_tcp_conn * c;
+ nni_tcp_conn *c;
int rv;
if (nni_aio_begin(aio) != 0) {
@@ -335,13 +335,15 @@ tcp_dialer_get_locaddr(void *arg, void *buf, size_t *szp, nni_type t)
static int
tcp_dialer_set_locaddr(void *arg, const void *buf, size_t sz, nni_type t)
{
- nni_tcp_dialer * d = arg;
- nng_sockaddr sa;
- SOCKADDR_STORAGE ss;
- struct sockaddr_in * sin;
+ nni_tcp_dialer *d = arg;
+ nng_sockaddr sa;
+ SOCKADDR_STORAGE ss;
+ struct sockaddr_in *sin;
+ size_t sslen;
+ int rv;
+#ifdef NNG_ENABLE_IPV6
struct sockaddr_in6 *sin6;
- size_t sslen;
- int rv;
+#endif
if ((rv = nni_copyin_sockaddr(&sa, buf, sz, t)) != 0) {
return (rv);
@@ -358,12 +360,14 @@ tcp_dialer_set_locaddr(void *arg, const void *buf, size_t sz, nni_type t)
return (NNG_EADDRINVAL);
}
break;
+#ifdef NNG_ENABLE_IPV6
case AF_INET6:
sin6 = (void *) &ss;
if (sin6->sin6_port != 0) {
return (NNG_EADDRINVAL);
}
break;
+#endif
default:
return (NNG_EADDRINVAL);
}