diff options
Diffstat (limited to 'src/platform')
| -rw-r--r-- | src/platform/posix/posix_ipc.h | 2 | ||||
| -rw-r--r-- | src/platform/posix/posix_ipcconn.c | 47 | ||||
| -rw-r--r-- | src/platform/posix/posix_sockfd.c | 42 | ||||
| -rw-r--r-- | src/platform/posix/posix_tcp.h | 4 | ||||
| -rw-r--r-- | src/platform/posix/posix_tcpconn.c | 80 | ||||
| -rw-r--r-- | src/platform/windows/win_ipcconn.c | 48 | ||||
| -rw-r--r-- | src/platform/windows/win_ipclisten.c | 8 | ||||
| -rw-r--r-- | src/platform/windows/win_resolv.c | 2 | ||||
| -rw-r--r-- | src/platform/windows/win_tcp.c | 1 | ||||
| -rw-r--r-- | src/platform/windows/win_tcp.h | 46 | ||||
| -rw-r--r-- | src/platform/windows/win_tcpconn.c | 75 | ||||
| -rw-r--r-- | src/platform/windows/win_tcpdial.c | 38 | ||||
| -rw-r--r-- | src/platform/windows/win_tcplisten.c | 18 |
13 files changed, 187 insertions, 224 deletions
diff --git a/src/platform/posix/posix_ipc.h b/src/platform/posix/posix_ipc.h index f1aa412d..7a48beaf 100644 --- a/src/platform/posix/posix_ipc.h +++ b/src/platform/posix/posix_ipc.h @@ -45,7 +45,7 @@ struct nni_ipc_dialer { #endif }; -extern int nni_posix_ipc_alloc( +extern nng_err nni_posix_ipc_alloc( nni_ipc_conn **, nni_sockaddr *, nni_ipc_dialer *, int); extern void nni_posix_ipc_dialer_rele(nni_ipc_dialer *); extern void nni_posix_ipc_dialer_cb(void *arg, unsigned events); diff --git a/src/platform/posix/posix_ipcconn.c b/src/platform/posix/posix_ipcconn.c index fd3cdbd8..11bd03d8 100644 --- a/src/platform/posix/posix_ipcconn.c +++ b/src/platform/posix/posix_ipcconn.c @@ -300,6 +300,14 @@ ipc_recv(void *arg, nni_aio *aio) } static nng_err +ipc_sock_addr(void *arg, const nng_sockaddr **sap) +{ + ipc_conn *c = arg; + *sap = &c->sa; + return (NNG_OK); +} + +static nng_err ipc_get_peer_uid(void *arg, void *buf, size_t *szp, nni_type t) { ipc_conn *c = arg; @@ -367,13 +375,6 @@ ipc_get_peer_pid(void *arg, void *buf, size_t *szp, nni_type t) return (nni_copyout_int(id, buf, szp, t)); } -static nng_err -ipc_get_addr(void *arg, void *buf, size_t *szp, nni_type t) -{ - ipc_conn *c = arg; - return (nni_copyout_sockaddr(&c->sa, buf, szp, t)); -} - static void ipc_stop(void *arg) { @@ -413,14 +414,6 @@ ipc_free(void *arg) static const nni_option ipc_options[] = { { - .o_name = NNG_OPT_LOCADDR, - .o_get = ipc_get_addr, - }, - { - .o_name = NNG_OPT_REMADDR, - .o_get = ipc_get_addr, - }, - { .o_name = NNG_OPT_IPC_PEER_PID, .o_get = ipc_get_peer_pid, }, @@ -455,7 +448,7 @@ ipc_set(void *arg, const char *name, const void *val, size_t sz, nni_type t) return (nni_setopt(ipc_options, name, c, val, sz, t)); } -int +nng_err nni_posix_ipc_alloc( nni_ipc_conn **cp, nni_sockaddr *sa, nni_ipc_dialer *d, int fd) { @@ -465,16 +458,18 @@ nni_posix_ipc_alloc( return (NNG_ENOMEM); } - c->closed = false; - c->dialer = d; - c->stream.s_free = ipc_free; - c->stream.s_close = ipc_close; - c->stream.s_stop = ipc_stop; - c->stream.s_send = ipc_send; - c->stream.s_recv = ipc_recv; - c->stream.s_get = ipc_get; - c->stream.s_set = ipc_set; - c->sa = *sa; + c->closed = false; + c->dialer = d; + c->stream.s_free = ipc_free; + c->stream.s_close = ipc_close; + c->stream.s_stop = ipc_stop; + c->stream.s_send = ipc_send; + c->stream.s_recv = ipc_recv; + c->stream.s_get = ipc_get; + c->stream.s_set = ipc_set; + c->stream.s_self_addr = ipc_sock_addr, + c->stream.s_peer_addr = ipc_sock_addr; + c->sa = *sa; nni_mtx_init(&c->mtx); nni_aio_list_init(&c->readq); diff --git a/src/platform/posix/posix_sockfd.c b/src/platform/posix/posix_sockfd.c index 6762987b..43225e7e 100644 --- a/src/platform/posix/posix_sockfd.c +++ b/src/platform/posix/posix_sockfd.c @@ -328,15 +328,6 @@ sfd_recv(void *arg, nni_aio *aio) } static nng_err -sfd_get_addr(void *arg, void *buf, size_t *szp, nni_type t) -{ - NNI_ARG_UNUSED(arg); - nng_sockaddr sa; - sa.s_family = NNG_AF_UNSPEC; - return (nni_copyout_sockaddr(&sa, buf, szp, t)); -} - -static nng_err sfd_get_peer_uid(void *arg, void *buf, size_t *szp, nni_type t) { nni_sfd_conn *c = arg; @@ -406,14 +397,6 @@ sfd_get_peer_pid(void *arg, void *buf, size_t *szp, nni_type t) static const nni_option sfd_options[] = { { - .o_name = NNG_OPT_LOCADDR, - .o_get = sfd_get_addr, - }, - { - .o_name = NNG_OPT_REMADDR, - .o_get = sfd_get_addr, - }, - { .o_name = NNG_OPT_PEER_PID, .o_get = sfd_get_peer_pid, }, @@ -448,6 +431,15 @@ sfd_set(void *arg, const char *name, const void *buf, size_t sz, nni_type t) return (nni_setopt(sfd_options, name, c, buf, sz, t)); } +static nng_err +sfd_addr(void *arg, const nng_sockaddr **sap) +{ + static nng_sockaddr sa = { .s_family = NNG_AF_UNSPEC }; + NNI_ARG_UNUSED(arg); + *sap = &sa; + return (NNG_OK); +} + nng_err nni_sfd_conn_alloc(nni_sfd_conn **cp, int fd) { @@ -464,13 +456,15 @@ nni_sfd_conn_alloc(nni_sfd_conn **cp, int fd) nni_aio_list_init(&c->readq); nni_aio_list_init(&c->writeq); - c->stream.s_free = sfd_free; - c->stream.s_close = sfd_close; - c->stream.s_stop = sfd_stop; - c->stream.s_recv = sfd_recv; - c->stream.s_send = sfd_send; - c->stream.s_get = sfd_get; - c->stream.s_set = sfd_set; + c->stream.s_free = sfd_free; + c->stream.s_close = sfd_close; + c->stream.s_stop = sfd_stop; + c->stream.s_recv = sfd_recv; + c->stream.s_send = sfd_send; + c->stream.s_get = sfd_get; + c->stream.s_set = sfd_set; + c->stream.s_peer_addr = sfd_addr; + c->stream.s_self_addr = sfd_addr; *cp = c; return (NNG_OK); diff --git a/src/platform/posix/posix_tcp.h b/src/platform/posix/posix_tcp.h index 3b61d7da..20325841 100644 --- a/src/platform/posix/posix_tcp.h +++ b/src/platform/posix/posix_tcp.h @@ -1,5 +1,5 @@ // -// Copyright 2024 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2025 Staysail Systems, Inc. <info@staysail.tech> // Copyright 2018 Capitar IT Group BV <info@capitar.com> // Copyright 2018 Devolutions <info@devolutions.net> // @@ -26,6 +26,8 @@ struct nni_tcp_conn { nni_aio *dial_aio; nni_tcp_dialer *dialer; nni_reap_node reap; + nng_sockaddr peer; + nng_sockaddr self; }; extern int nni_posix_tcp_alloc(nni_tcp_conn **, nni_tcp_dialer *, int); diff --git a/src/platform/posix/posix_tcpconn.c b/src/platform/posix/posix_tcpconn.c index 674e3f46..43dfb4e4 100644 --- a/src/platform/posix/posix_tcpconn.c +++ b/src/platform/posix/posix_tcpconn.c @@ -333,41 +333,19 @@ tcp_recv(void *arg, nni_aio *aio) } static nng_err -tcp_get_peername(void *arg, void *buf, size_t *szp, nni_type t) +tcp_get_peer_addr(void *arg, const nng_sockaddr **addr) { - nni_tcp_conn *c = arg; - struct sockaddr_storage ss; - socklen_t len = sizeof(ss); - int fd = nni_posix_pfd_fd(&c->pfd); - nng_err rv; - nng_sockaddr sa; - - if (getpeername(fd, (void *) &ss, &len) != 0) { - return (nni_plat_errno(errno)); - } - if ((rv = nni_posix_sockaddr2nn(&sa, &ss, len)) == NNG_OK) { - rv = nni_copyout_sockaddr(&sa, buf, szp, t); - } - return (rv); + nni_tcp_conn *c = arg; + *addr = &c->peer; + return (NNG_OK); } static nng_err -tcp_get_sockname(void *arg, void *buf, size_t *szp, nni_type t) +tcp_get_self_addr(void *arg, const nng_sockaddr **addr) { - nni_tcp_conn *c = arg; - struct sockaddr_storage ss; - socklen_t len = sizeof(ss); - int fd = nni_posix_pfd_fd(&c->pfd); - int rv; - nng_sockaddr sa; - - if (getsockname(fd, (void *) &ss, &len) != 0) { - return (nni_plat_errno(errno)); - } - if ((rv = nni_posix_sockaddr2nn(&sa, &ss, len)) == NNG_OK) { - rv = nni_copyout_sockaddr(&sa, buf, szp, t); - } - return (rv); + nni_tcp_conn *c = arg; + *addr = &c->self; + return (NNG_OK); } static nng_err @@ -402,14 +380,6 @@ tcp_get_keepalive(void *arg, void *buf, size_t *szp, nni_type t) static const nni_option tcp_options[] = { { - .o_name = NNG_OPT_REMADDR, - .o_get = tcp_get_peername, - }, - { - .o_name = NNG_OPT_LOCADDR, - .o_get = tcp_get_sockname, - }, - { .o_name = NNG_OPT_TCP_NODELAY, .o_get = tcp_get_nodelay, }, @@ -452,13 +422,15 @@ nni_posix_tcp_alloc(nni_tcp_conn **cp, nni_tcp_dialer *d, int fd) nni_aio_list_init(&c->writeq); nni_posix_pfd_init(&c->pfd, fd, tcp_cb, c); - c->stream.s_free = tcp_free; - c->stream.s_stop = tcp_stop; - c->stream.s_close = tcp_close; - c->stream.s_recv = tcp_recv; - c->stream.s_send = tcp_send; - c->stream.s_get = tcp_get; - c->stream.s_set = tcp_set; + c->stream.s_free = tcp_free; + c->stream.s_stop = tcp_stop; + c->stream.s_close = tcp_close; + c->stream.s_recv = tcp_recv; + c->stream.s_send = tcp_send; + c->stream.s_get = tcp_get; + c->stream.s_set = tcp_set; + c->stream.s_peer_addr = tcp_get_peer_addr; + c->stream.s_self_addr = tcp_get_self_addr; *cp = c; return (0); @@ -467,9 +439,19 @@ nni_posix_tcp_alloc(nni_tcp_conn **cp, nni_tcp_dialer *d, int fd) void nni_posix_tcp_start(nni_tcp_conn *c, int nodelay, int keepalive) { + int fd = nni_posix_pfd_fd(&c->pfd); // Configure the initial socket options. - (void) setsockopt(nni_posix_pfd_fd(&c->pfd), IPPROTO_TCP, TCP_NODELAY, - &nodelay, sizeof(int)); - (void) setsockopt(nni_posix_pfd_fd(&c->pfd), SOL_SOCKET, SO_KEEPALIVE, - &keepalive, sizeof(int)); + (void) setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &nodelay, sizeof(int)); + (void) setsockopt( + fd, SOL_SOCKET, SO_KEEPALIVE, &keepalive, sizeof(int)); + + struct sockaddr_storage ss; + socklen_t len = sizeof(ss); + + // Get this info now so we can avoid system calls later. + (void) getpeername(fd, (void *) &ss, &len); + nni_posix_sockaddr2nn(&c->peer, &ss, len); + + (void) getsockname(fd, (void *) &ss, &len); + nni_posix_sockaddr2nn(&c->self, &ss, len); } diff --git a/src/platform/windows/win_ipcconn.c b/src/platform/windows/win_ipcconn.c index 45235387..a5ef16a6 100644 --- a/src/platform/windows/win_ipcconn.c +++ b/src/platform/windows/win_ipcconn.c @@ -9,8 +9,8 @@ // found online at https://opensource.org/licenses/MIT. // -#include "core/aio.h" -#include "core/nng_impl.h" +#include "../../core/nng_impl.h" +#include "win_impl.h" #include "win_ipc.h" @@ -276,7 +276,7 @@ ipc_send_cb(nni_win_io *io, int rv, size_t num) } static void -ipc_send_cancel(nni_aio *aio, void *arg, int rv) +ipc_send_cancel(nni_aio *aio, void *arg, nng_err rv) { ipc_conn *c = arg; nni_mtx_lock(&c->mtx); @@ -388,12 +388,6 @@ ipc_free(void *arg) } static nng_err -ipc_conn_get_addr(void *c, void *buf, size_t *szp, nni_opt_type t) -{ - return (nni_copyout_sockaddr(&(CONN(c))->sa, buf, szp, t)); -} - -static nng_err ipc_conn_get_peer_pid(void *c, void *buf, size_t *szp, nni_opt_type t) { ULONG id; @@ -415,14 +409,6 @@ ipc_conn_get_peer_pid(void *c, void *buf, size_t *szp, nni_opt_type t) static const nni_option ipc_conn_options[] = { { - .o_name = NNG_OPT_LOCADDR, - .o_get = ipc_conn_get_addr, - }, - { - .o_name = NNG_OPT_REMADDR, - .o_get = ipc_conn_get_addr, - }, - { .o_name = NNG_OPT_IPC_PEER_PID, .o_get = ipc_conn_get_peer_pid, }, @@ -445,6 +431,14 @@ ipc_get(void *arg, const char *nm, void *val, size_t *szp, nni_opt_type t) return (nni_getopt(ipc_conn_options, nm, c, val, szp, t)); } +static nng_err +ipc_addr(void *arg, const nng_sockaddr **sap) +{ + ipc_conn *c = arg; + *sap = &c->sa; + return (NNG_OK); +} + int nni_win_ipc_init( nng_stream **connp, HANDLE p, const nng_sockaddr *sa, bool dialer) @@ -459,15 +453,17 @@ nni_win_ipc_init( nni_cv_init(&c->cv, &c->mtx); nni_aio_list_init(&c->recv_aios); nni_aio_list_init(&c->send_aios); - c->dialer = dialer; - c->sa = *sa; - c->stream.s_free = ipc_free; - c->stream.s_close = ipc_close; - c->stream.s_stop = ipc_stop; - c->stream.s_send = ipc_send; - c->stream.s_recv = ipc_recv; - c->stream.s_get = ipc_get; - c->stream.s_set = ipc_set; + c->dialer = dialer; + c->sa = *sa; + c->stream.s_free = ipc_free; + c->stream.s_close = ipc_close; + c->stream.s_stop = ipc_stop; + c->stream.s_send = ipc_send; + c->stream.s_recv = ipc_recv; + c->stream.s_get = ipc_get; + c->stream.s_set = ipc_set; + c->stream.s_self_addr = ipc_addr; + c->stream.s_peer_addr = ipc_addr; nni_win_io_init(&c->recv_io, ipc_recv_cb, c); nni_win_io_init(&c->send_io, ipc_send_cb, c); diff --git a/src/platform/windows/win_ipclisten.c b/src/platform/windows/win_ipclisten.c index 3bb71c7d..07c69507 100644 --- a/src/platform/windows/win_ipclisten.c +++ b/src/platform/windows/win_ipclisten.c @@ -9,7 +9,7 @@ // found online at https://opensource.org/licenses/MIT. // -#include "core/nng_impl.h" +#include "../../core/nng_impl.h" #include "win_ipc.h" @@ -158,7 +158,7 @@ ipc_listener_set_sec_desc(void *arg, void *desc) return (NNG_OK); } -static int +static nng_err ipc_listener_get_addr(void *arg, void *buf, size_t *szp, nni_type t) { ipc_listener *l = arg; @@ -175,7 +175,7 @@ static const nni_option ipc_listener_options[] = { }, }; -static int +static nng_err ipc_listener_set( void *arg, const char *name, const void *buf, size_t sz, nni_type t) { @@ -183,7 +183,7 @@ ipc_listener_set( return (nni_setopt(ipc_listener_options, name, l, buf, sz, t)); } -static int +static nng_err ipc_listener_get( void *arg, const char *name, void *buf, size_t *szp, nni_type t) { diff --git a/src/platform/windows/win_resolv.c b/src/platform/windows/win_resolv.c index 50b030da..3ccbf982 100644 --- a/src/platform/windows/win_resolv.c +++ b/src/platform/windows/win_resolv.c @@ -31,7 +31,7 @@ static nni_mtx resolv_mtx; static nni_cv resolv_cv; static void -resolv_cancel(nni_aio *aio, void *arg, int rv) +resolv_cancel(nni_aio *aio, void *arg, nng_err rv) { nni_resolv_item *item = arg; diff --git a/src/platform/windows/win_tcp.c b/src/platform/windows/win_tcp.c index 42667dea..006c99e8 100644 --- a/src/platform/windows/win_tcp.c +++ b/src/platform/windows/win_tcp.c @@ -12,7 +12,6 @@ #ifdef NNG_PLATFORM_WINDOWS -#include <malloc.h> #include <stdio.h> static LPFN_ACCEPTEX acceptex; diff --git a/src/platform/windows/win_tcp.h b/src/platform/windows/win_tcp.h index ec8ab80c..698160b2 100644 --- a/src/platform/windows/win_tcp.h +++ b/src/platform/windows/win_tcp.h @@ -1,5 +1,5 @@ // -// Copyright 2024 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2025 Staysail Systems, Inc. <info@staysail.tech> // Copyright 2018 Capitar IT Group BV <info@capitar.com> // Copyright 2019 Devolutions <info@devolutions.net> // @@ -14,30 +14,30 @@ // This header file is private to the TCP support for Windows. -#include "core/nng_impl.h" +#include "../../core/nng_impl.h" struct nni_tcp_conn { - nng_stream ops; - SOCKET s; - nni_win_io recv_io; - nni_win_io send_io; - nni_win_io conn_io; - nni_list recv_aios; - nni_list send_aios; - nni_aio *conn_aio; - SOCKADDR_STORAGE sockname; - SOCKADDR_STORAGE peername; - nni_tcp_dialer *dialer; - void *listener; - int recv_rv; - int send_rv; - int conn_rv; - bool closed; - char buf[512]; // to hold acceptex results - bool sending; - bool recving; - nni_mtx mtx; - nni_cv cv; + nng_stream ops; + SOCKET s; + nni_win_io recv_io; + nni_win_io send_io; + nni_win_io conn_io; + nni_list recv_aios; + nni_list send_aios; + nni_aio *conn_aio; + nng_sockaddr sockname; + nng_sockaddr peername; + nni_tcp_dialer *dialer; + void *listener; + int recv_rv; + int send_rv; + int conn_rv; + bool closed; + char buf[512]; // to hold acceptex results + bool sending; + bool recving; + nni_mtx mtx; + nni_cv cv; }; extern int nni_win_tcp_init(nni_tcp_conn **, SOCKET); diff --git a/src/platform/windows/win_tcpconn.c b/src/platform/windows/win_tcpconn.c index 102700ec..dae6b58d 100644 --- a/src/platform/windows/win_tcpconn.c +++ b/src/platform/windows/win_tcpconn.c @@ -9,11 +9,10 @@ // found online at https://opensource.org/licenses/MIT. // -#include "core/nng_impl.h" +#include "../../core/nng_impl.h" #include "win_tcp.h" -#include <malloc.h> #include <stdio.h> static void @@ -180,7 +179,7 @@ tcp_send_start(nni_tcp_conn *c) } static void -tcp_send_cancel(nni_aio *aio, void *arg, int rv) +tcp_send_cancel(nni_aio *aio, void *arg, nng_err rv) { nni_tcp_conn *c = arg; nni_mtx_lock(&c->mtx); @@ -263,30 +262,6 @@ tcp_close(void *arg) } static nng_err -tcp_get_peername(void *arg, void *buf, size_t *szp, nni_type t) -{ - nni_tcp_conn *c = arg; - nng_sockaddr sa; - - if (nni_win_sockaddr2nn(&sa, &c->peername, sizeof(c->peername)) < 0) { - return (NNG_EADDRINVAL); - } - return (nni_copyout_sockaddr(&sa, buf, szp, t)); -} - -static nng_err -tcp_get_sockname(void *arg, void *buf, size_t *szp, nni_type t) -{ - nni_tcp_conn *c = arg; - nng_sockaddr sa; - - if (nni_win_sockaddr2nn(&sa, &c->sockname, sizeof(c->sockname)) < 0) { - return (NNG_EADDRINVAL); - } - return (nni_copyout_sockaddr(&sa, buf, szp, t)); -} - -static nng_err tcp_get_nodelay(void *arg, void *buf, size_t *szp, nni_type t) { nni_tcp_conn *c = arg; @@ -314,16 +289,24 @@ tcp_get_keepalive(void *arg, void *buf, size_t *szp, nni_type t) return (nni_copyout_bool(b, buf, szp, t)); } +static nng_err +tcp_self_addr(void *arg, const nng_sockaddr **sap) +{ + nni_tcp_conn *c = arg; + *sap = &c->sockname; + return (NNG_OK); +} + +static nng_err +tcp_peer_addr(void *arg, const nng_sockaddr **sap) +{ + nni_tcp_conn *c = arg; + *sap = &c->peername; + return (NNG_OK); +} + static const nni_option tcp_options[] = { { - .o_name = NNG_OPT_REMADDR, - .o_get = tcp_get_peername, - }, - { - .o_name = NNG_OPT_LOCADDR, - .o_get = tcp_get_sockname, - }, - { .o_name = NNG_OPT_TCP_NODELAY, .o_get = tcp_get_nodelay, }, @@ -336,14 +319,14 @@ static const nni_option tcp_options[] = { }, }; -static int +static nng_err tcp_get(void *arg, const char *name, void *buf, size_t *szp, nni_type t) { nni_tcp_conn *c = arg; return (nni_getopt(tcp_options, name, c, buf, szp, t)); } -static int +static nng_err tcp_set(void *arg, const char *name, const void *buf, size_t sz, nni_type t) { nni_tcp_conn *c = arg; @@ -397,14 +380,16 @@ nni_win_tcp_init(nni_tcp_conn **connp, SOCKET s) nni_cv_init(&c->cv, &c->mtx); nni_aio_list_init(&c->recv_aios); nni_aio_list_init(&c->send_aios); - c->conn_aio = NULL; - c->ops.s_close = tcp_close; - c->ops.s_stop = tcp_stop; - c->ops.s_free = tcp_free; - c->ops.s_send = tcp_send; - c->ops.s_recv = tcp_recv; - c->ops.s_get = tcp_get; - c->ops.s_set = tcp_set; + c->conn_aio = NULL; + c->ops.s_close = tcp_close; + c->ops.s_stop = tcp_stop; + c->ops.s_free = tcp_free; + c->ops.s_send = tcp_send; + c->ops.s_recv = tcp_recv; + c->ops.s_get = tcp_get; + c->ops.s_set = tcp_set; + c->ops.s_peer_addr = tcp_peer_addr; + c->ops.s_self_addr = tcp_self_addr; nni_win_io_init(&c->recv_io, tcp_recv_cb, c); nni_win_io_init(&c->send_io, tcp_send_cb, c); diff --git a/src/platform/windows/win_tcpdial.c b/src/platform/windows/win_tcpdial.c index 72e4f8a7..a3d64869 100644 --- a/src/platform/windows/win_tcpdial.c +++ b/src/platform/windows/win_tcpdial.c @@ -9,11 +9,10 @@ // found online at https://opensource.org/licenses/MIT. // -#include "core/nng_impl.h" +#include "../../core/nng_impl.h" #include "win_tcp.h" -#include <malloc.h> #include <stdio.h> struct nni_tcp_dialer { @@ -145,8 +144,9 @@ tcp_dial_cb(nni_win_io *io, int rv, size_t cnt) nng_stream_free(&c->ops); nni_aio_finish_error(aio, rv); } else { - DWORD yes = 1; - int len; + DWORD yes = 1; + int len; + SOCKADDR_STORAGE sa; (void) setsockopt(c->s, SOL_SOCKET, SO_UPDATE_CONNECT_CONTEXT, (char *) &yes, sizeof(yes)); @@ -157,8 +157,13 @@ tcp_dial_cb(nni_win_io *io, int rv, size_t cnt) (void) setsockopt( c->s, IPPROTO_TCP, TCP_NODELAY, (char *) &nd, sizeof(nd)); - len = sizeof(SOCKADDR_STORAGE); - (void) getsockname(c->s, (SOCKADDR *) &c->sockname, &len); + len = sizeof(sa); + (void) getsockname(c->s, (SOCKADDR *) &sa, &len); + nni_win_sockaddr2nn(&c->sockname, &sa, len); + + len = sizeof(sa); + (void) getpeername(c->s, (SOCKADDR *) &sa, &len); + nni_win_sockaddr2nn(&c->peername, &sa, len); nni_aio_set_output(aio, 0, c); nni_aio_finish(aio, 0, 0); @@ -169,19 +174,21 @@ void nni_tcp_dial(nni_tcp_dialer *d, const nni_sockaddr *sa, nni_aio *aio) { SOCKET s; - SOCKADDR_STORAGE ss; + SOCKADDR_STORAGE peername; + SOCKADDR_STORAGE sockname; int len; nni_tcp_conn *c; int rv; nni_aio_reset(aio); - if ((len = nni_win_nn2sockaddr(&ss, sa)) <= 0) { + if ((len = nni_win_nn2sockaddr(&peername, sa)) <= 0) { nni_aio_finish_error(aio, NNG_EADDRINVAL); return; } - if ((s = socket(ss.ss_family, SOCK_STREAM, 0)) == INVALID_SOCKET) { + if ((s = socket(peername.ss_family, SOCK_STREAM, 0)) == + INVALID_SOCKET) { nni_aio_finish_error(aio, nni_win_error(GetLastError())); return; } @@ -192,8 +199,6 @@ nni_tcp_dial(nni_tcp_dialer *d, const nni_sockaddr *sa, nni_aio *aio) return; } - c->peername = ss; - nni_win_io_init(&c->conn_io, tcp_dial_cb, c); nni_mtx_lock(&d->mtx); @@ -209,12 +214,13 @@ nni_tcp_dial(nni_tcp_dialer *d, const nni_sockaddr *sa, nni_aio *aio) // same family, unless a different default was requested. if (d->srclen != 0) { len = (int) d->srclen; + memcpy(&sockname, &d->src, len); memcpy(&c->sockname, &d->src, len); } else { - ZeroMemory(&c->sockname, sizeof(c->sockname)); - c->sockname.ss_family = ss.ss_family; + ZeroMemory(&sockname, sizeof(sockname)); + sockname.ss_family = peername.ss_family; } - if (bind(s, (SOCKADDR *) &c->sockname, len) != 0) { + if (bind(s, (SOCKADDR *) &sockname, len) != 0) { rv = nni_win_error(GetLastError()); nni_mtx_unlock(&d->mtx); nng_stream_free(&c->ops); @@ -222,6 +228,8 @@ nni_tcp_dial(nni_tcp_dialer *d, const nni_sockaddr *sa, nni_aio *aio) return; } + nni_win_sockaddr2nn(&c->sockname, &sockname, sizeof(sockname)); + if (!nni_aio_start(aio, tcp_dial_cancel, d)) { nni_mtx_unlock(&d->mtx); nng_stream_free(&c->ops); @@ -234,7 +242,7 @@ nni_tcp_dial(nni_tcp_dialer *d, const nni_sockaddr *sa, nni_aio *aio) // dialing is concurrent. if (!nni_win_connectex( - s, (SOCKADDR *) &c->peername, len, &c->conn_io.olpd)) { + s, (SOCKADDR *) &peername, len, &c->conn_io.olpd)) { if ((rv = GetLastError()) != ERROR_IO_PENDING) { nni_aio_list_remove(aio); nni_mtx_unlock(&d->mtx); diff --git a/src/platform/windows/win_tcplisten.c b/src/platform/windows/win_tcplisten.c index 563cbcf0..0b11104d 100644 --- a/src/platform/windows/win_tcplisten.c +++ b/src/platform/windows/win_tcplisten.c @@ -9,12 +9,10 @@ // found online at https://opensource.org/licenses/MIT. // -#include "core/nng_impl.h" - -#include <malloc.h> #include <stdbool.h> #include <stdio.h> +#include "../../core/nng_impl.h" #include "win_tcp.h" typedef struct tcp_listener { @@ -220,10 +218,12 @@ tcp_accept_cancel(nni_aio *aio, void *arg, nng_err rv) static void tcp_listener_accepted(tcp_listener *l) { - BOOL nd; - BOOL ka; - nni_tcp_conn *c; - nni_aio *aio; + BOOL nd; + BOOL ka; + nni_tcp_conn *c; + nni_aio *aio; + SOCKADDR_STORAGE sockname; + SOCKADDR_STORAGE peername; aio = nni_list_first(&l->aios); c = l->pend_conn; @@ -232,7 +232,9 @@ tcp_listener_accepted(tcp_listener *l) nd = l->nodelay; nni_aio_list_remove(aio); - nni_win_get_acceptex_sockaddrs(c->buf, &c->sockname, &c->peername); + nni_win_get_acceptex_sockaddrs(c->buf, &sockname, &peername); + nni_win_sockaddr2nn(&c->sockname, &sockname, sizeof(sockname)); + nni_win_sockaddr2nn(&c->peername, &peername, sizeof(peername)); (void) setsockopt(c->s, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, (char *) &l->s, sizeof(l->s)); |
