diff options
Diffstat (limited to 'src/supplemental')
| -rw-r--r-- | src/supplemental/tcp/tcp.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/supplemental/tcp/tcp.c b/src/supplemental/tcp/tcp.c index 3ec396b8..21922ef6 100644 --- a/src/supplemental/tcp/tcp.c +++ b/src/supplemental/tcp/tcp.c @@ -327,10 +327,51 @@ tcp_listener_accept(void *arg, nng_aio *aio) } static int +tcp_listener_get_port(void *arg, void *buf, size_t *szp, nni_type t) +{ + tcp_listener *l = arg; + int rv; + nng_sockaddr sa; + size_t sz; + int port; + uint8_t * paddr; + + sz = sizeof(sa); + rv = nni_tcp_listener_getopt( + l->l, NNG_OPT_LOCADDR, &sa, &sz, NNI_TYPE_SOCKADDR); + if (rv != 0) { + return (rv); + } + + switch (sa.s_family) { + case NNG_AF_INET: + paddr = (void *) &sa.s_in.sa_port; + break; + + case NNG_AF_INET6: + paddr = (void *) &sa.s_in.sa_port; + break; + default: + paddr = NULL; + break; + } + + if (paddr == NULL) { + return (NNG_ESTATE); + } + + NNI_GET16(paddr, port); + return (nni_copyout_int(port, buf, szp, t)); +} + +static int tcp_listener_getx( void *arg, const char *name, void *buf, size_t *szp, nni_type t) { tcp_listener *l = arg; + if (strcmp(name, NNG_OPT_TCP_BOUND_PORT) == 0) { + return (tcp_listener_get_port(l, buf, szp, t)); + } return (nni_tcp_listener_getopt(l->l, name, buf, szp, t)); } |
