From 6d0027fae75e4810d66eb4c5817255ffa517e158 Mon Sep 17 00:00:00 2001 From: Garrett D'Amore Date: Sat, 5 Jan 2019 16:30:02 -0800 Subject: fixes #839 TCP listener_start API should use constant sockaddr --- include/nng/supplemental/tcp/tcp.h | 9 +++--- include/nng/supplemental/tls/tls.h | 2 +- src/core/platform.h | 7 ++-- src/platform/posix/posix_tcplisten.c | 11 +------ src/platform/windows/win_tcplisten.c | 3 +- src/supplemental/tcp/tcp.c | 2 +- src/supplemental/tls/tls_common.c | 2 +- src/transport/tcp/tcp.c | 63 ------------------------------------ tests/tcpsupp.c | 7 +++- 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 @@ -988,57 +988,6 @@ tcptran_ep_set_recvmaxsz(void *arg, const void *v, size_t sz, nni_opt_type t) return (rv); } -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) { @@ -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. +// Copyright 2019 Staysail Systems, Inc. // Copyright 2018 Capitar IT Group BV // // 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); -- cgit v1.2.3-70-g09d2