aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2019-01-05 16:30:02 -0800
committerGarrett D'Amore <garrett@damore.org>2019-01-06 12:12:27 -0800
commit6d0027fae75e4810d66eb4c5817255ffa517e158 (patch)
tree9bd36c16cf293e4335ab0650e226a335029012ad
parent68c6310ee83078d6ad6af0c9ccddef11b8f8b7c2 (diff)
downloadnng-6d0027fae75e4810d66eb4c5817255ffa517e158.tar.gz
nng-6d0027fae75e4810d66eb4c5817255ffa517e158.tar.bz2
nng-6d0027fae75e4810d66eb4c5817255ffa517e158.zip
fixes #839 TCP listener_start API should use constant sockaddr
-rw-r--r--include/nng/supplemental/tcp/tcp.h9
-rw-r--r--include/nng/supplemental/tls/tls.h2
-rw-r--r--src/core/platform.h7
-rw-r--r--src/platform/posix/posix_tcplisten.c11
-rw-r--r--src/platform/windows/win_tcplisten.c3
-rw-r--r--src/supplemental/tcp/tcp.c2
-rw-r--r--src/supplemental/tls/tls_common.c2
-rw-r--r--src/transport/tcp/tcp.c63
-rw-r--r--tests/tcpsupp.c7
9 files changed, 17 insertions, 89 deletions
diff --git a/include/nng/supplemental/tcp/tcp.h b/include/nng/supplemental/tcp/tcp.h
index 447bc6f8..295006c7 100644
--- a/include/nng/supplemental/tcp/tcp.h
+++ b/include/nng/supplemental/tcp/tcp.h
@@ -125,11 +125,10 @@ NNG_DECL void nng_tcp_listener_free(nng_tcp_listener *);
// the TCP port / address to be allocated. It does not accept any new
// incoming connections. (The listenq depth is configured to some reasonable
// default -- typically around 128.) This operation is synchronous.
-// On success, the sockaddr will be update with the actual address bound.
-// This is useful if the TCP port number 0 is specified, which permits
-// the implementation to choose a free random port. The caller can then
-// inspect the sockaddr to learn the actual bound port.
-NNG_DECL int nng_tcp_listener_listen(nng_tcp_listener *, nng_sockaddr *);
+// A zero valued port may be supplied in the sockaddr, in which case
+// a follow up call to get the NNG_OPT_LOCADDR can be used to determine the
+// bound address.
+NNG_DECL int nng_tcp_listener_listen(nng_tcp_listener *, const nng_sockaddr *);
// nng_tcp_listener_accept accepts an incoming connection (creating an
// nng_tcp * object), and returns it in the nng_aio as the first output
diff --git a/include/nng/supplemental/tls/tls.h b/include/nng/supplemental/tls/tls.h
index ee80b45b..496f02e2 100644
--- a/include/nng/supplemental/tls/tls.h
+++ b/include/nng/supplemental/tls/tls.h
@@ -164,7 +164,7 @@ NNG_DECL int nng_tls_dialer_setopt(
NNG_DECL int nng_tls_listener_alloc(nng_tls_listener **);
NNG_DECL void nng_tls_listener_close(nng_tls_listener *);
NNG_DECL void nng_tls_listener_free(nng_tls_listener *);
-NNG_DECL int nng_tls_listener_listen(nng_tls_listener *, nng_sockaddr *);
+NNG_DECL int nng_tls_listener_listen(nng_tls_listener *, const nng_sockaddr *);
NNG_DECL void nng_tls_listener_accept(nng_tls_listener *, nng_aio *);
NNG_DECL int nng_tls_listener_getopt(
diff --git a/src/core/platform.h b/src/core/platform.h
index 18107120..69fa5db6 100644
--- a/src/core/platform.h
+++ b/src/core/platform.h
@@ -317,11 +317,8 @@ extern void nni_tcp_listener_fini(nni_tcp_listener *);
extern void nni_tcp_listener_close(nni_tcp_listener *);
// nni_tcp_listener_listen creates the socket in listening mode, bound
-// to the specified address. The address will be updated to reflect
-// the actual address bound (making it possible to bind to port 0 to
-// specify an ephemeral address, and then the actual address can be
-// examined afterwards.)
-extern int nni_tcp_listener_listen(nni_tcp_listener *, nni_sockaddr *);
+// to the specified address.
+extern int nni_tcp_listener_listen(nni_tcp_listener *, const nni_sockaddr *);
// nni_tcp_listener_accept accepts in incoming connect, asynchronously.
// On success, the first (and only) output will be an nni_tcp_conn *
diff --git a/src/platform/posix/posix_tcplisten.c b/src/platform/posix/posix_tcplisten.c
index 82334431..1e1b84b1 100644
--- a/src/platform/posix/posix_tcplisten.c
+++ b/src/platform/posix/posix_tcplisten.c
@@ -184,7 +184,7 @@ tcp_listener_cancel(nni_aio *aio, void *arg, int rv)
}
int
-nni_tcp_listener_listen(nni_tcp_listener *l, nni_sockaddr *sa)
+nni_tcp_listener_listen(nni_tcp_listener *l, const nni_sockaddr *sa)
{
socklen_t len;
struct sockaddr_storage ss;
@@ -247,15 +247,6 @@ nni_tcp_listener_listen(nni_tcp_listener *l, nni_sockaddr *sa)
return (rv);
}
- // Lets get the bound sockname, and pass that back to the caller.
- // This permits ephemeral port binding to work.
- // If this fails for some reason, we just don't update the
- // sockaddr structure. This is kind of suboptimal, but failures
- // here should never occur.
- len = sizeof(ss);
- (void) getsockname(fd, (void *) &ss, &len);
- (void) nni_posix_sockaddr2nn(sa, &ss);
-
nni_posix_pfd_set_cb(pfd, tcp_listener_cb, l);
l->pfd = pfd;
diff --git a/src/platform/windows/win_tcplisten.c b/src/platform/windows/win_tcplisten.c
index 750de13b..9cf16985 100644
--- a/src/platform/windows/win_tcplisten.c
+++ b/src/platform/windows/win_tcplisten.c
@@ -186,7 +186,7 @@ nni_tcp_listener_fini(nni_tcp_listener *l)
}
int
-nni_tcp_listener_listen(nni_tcp_listener *l, nni_sockaddr *sa)
+nni_tcp_listener_listen(nni_tcp_listener *l, const nni_sockaddr *sa)
{
int rv;
BOOL yes;
@@ -244,7 +244,6 @@ nni_tcp_listener_listen(nni_tcp_listener *l, nni_sockaddr *sa)
nni_mtx_unlock(&l->mtx);
return (rv);
}
- nni_win_sockaddr2nn(sa, &l->ss);
l->started = true;
nni_mtx_unlock(&l->mtx);
return (0);
diff --git a/src/supplemental/tcp/tcp.c b/src/supplemental/tcp/tcp.c
index f880362b..b8410b16 100644
--- a/src/supplemental/tcp/tcp.c
+++ b/src/supplemental/tcp/tcp.c
@@ -126,7 +126,7 @@ nng_tcp_listener_free(nng_tcp_listener *l)
}
int
-nng_tcp_listener_listen(nng_tcp_listener *l, nng_sockaddr *sa)
+nng_tcp_listener_listen(nng_tcp_listener *l, const nng_sockaddr *sa)
{
return (nni_tcp_listener_listen((void *) l, sa));
}
diff --git a/src/supplemental/tls/tls_common.c b/src/supplemental/tls/tls_common.c
index 95466558..f93ca0ba 100644
--- a/src/supplemental/tls/tls_common.c
+++ b/src/supplemental/tls/tls_common.c
@@ -470,7 +470,7 @@ nng_tls_listener_alloc(nng_tls_listener **lp)
}
int
-nng_tls_listener_listen(nng_tls_listener *l, nng_sockaddr *sa)
+nng_tls_listener_listen(nng_tls_listener *l, const nng_sockaddr *sa)
{
tls_ep *ep = (void *) l;
return (nni_tcp_listener_listen(ep->tcp.l, sa));
diff --git a/src/transport/tcp/tcp.c b/src/transport/tcp/tcp.c
index 38b8cbaf..30695918 100644
--- a/src/transport/tcp/tcp.c
+++ b/src/transport/tcp/tcp.c
@@ -989,57 +989,6 @@ tcptran_ep_set_recvmaxsz(void *arg, const void *v, size_t sz, nni_opt_type t)
}
static int
-tcptran_ep_get_nodelay(void *arg, void *v, size_t *szp, nni_opt_type t)
-{
- tcptran_ep *ep = arg;
- int rv;
- nni_mtx_lock(&ep->mtx);
- rv = nni_copyout_bool(ep->nodelay, v, szp, t);
- nni_mtx_unlock(&ep->mtx);
- return (rv);
-}
-
-static int
-tcptran_ep_set_nodelay(void *arg, const void *v, size_t sz, nni_opt_type t)
-{
- tcptran_ep *ep = arg;
- bool val;
- int rv;
- if (((rv = nni_copyin_bool(&val, v, sz, t)) == 0) && (ep != NULL)) {
- nni_mtx_lock(&ep->mtx);
- ep->nodelay = val;
- nni_mtx_unlock(&ep->mtx);
- }
- return (rv);
-}
-
-static int
-tcptran_ep_get_keepalive(void *arg, void *v, size_t *szp, nni_opt_type t)
-{
- tcptran_ep *ep = arg;
- int rv;
-
- nni_mtx_lock(&ep->mtx);
- rv = nni_copyout_bool(ep->keepalive, v, szp, t);
- nni_mtx_unlock(&ep->mtx);
- return (rv);
-}
-
-static int
-tcptran_ep_set_keepalive(void *arg, const void *v, size_t sz, nni_opt_type t)
-{
- tcptran_ep *ep = arg;
- bool val;
- int rv;
- if (((rv = nni_copyin_bool(&val, v, sz, t)) == 0) && (ep != NULL)) {
- nni_mtx_lock(&ep->mtx);
- ep->keepalive = val;
- nni_mtx_unlock(&ep->mtx);
- }
- return (rv);
-}
-
-static int
tcptran_ep_bind(void *arg)
{
tcptran_ep *ep = arg;
@@ -1082,18 +1031,6 @@ tcptran_ep_accept(void *arg, nni_aio *aio)
nni_mtx_unlock(&ep->mtx);
}
-static int
-tcptran_ep_get_locaddr(void *arg, void *buf, size_t *szp, nni_opt_type t)
-{
- tcptran_ep *ep = arg;
- int rv;
-
- nni_mtx_lock(&ep->mtx);
- rv = nni_copyout_sockaddr(&ep->bsa, buf, szp, t);
- nni_mtx_unlock(&ep->mtx);
- return (rv);
-}
-
static nni_tran_pipe_ops tcptran_pipe_ops = {
.p_init = tcptran_pipe_init,
.p_fini = tcptran_pipe_fini,
diff --git a/tests/tcpsupp.c b/tests/tcpsupp.c
index ede6a76f..1f91a60c 100644
--- a/tests/tcpsupp.c
+++ b/tests/tcpsupp.c
@@ -1,5 +1,5 @@
//
-// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
+// Copyright 2019 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
@@ -34,14 +34,19 @@ TestMain("Supplemental TCP", {
Convey("Listener listens (wildcard)", {
nng_sockaddr sa;
uint32_t ip;
+ size_t sz;
memcpy(&ip, loopback, 4);
sa.s_in.sa_family = NNG_AF_INET;
sa.s_in.sa_addr = ip;
sa.s_in.sa_port = 0;
+ sz = sizeof(sa);
So(nng_tcp_listener_listen(l, &sa) == 0);
+ So(nng_tcp_listener_getopt(
+ l, NNG_OPT_LOCADDR, &sa, &sz) == 0);
+ So(sz == sizeof(sa));
So(sa.s_in.sa_port != 0);
So(sa.s_in.sa_addr == ip);