aboutsummaryrefslogtreecommitdiff
path: root/src/platform/windows
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform/windows')
-rw-r--r--src/platform/windows/win_ipcconn.c48
-rw-r--r--src/platform/windows/win_ipclisten.c8
-rw-r--r--src/platform/windows/win_resolv.c2
-rw-r--r--src/platform/windows/win_tcp.c1
-rw-r--r--src/platform/windows/win_tcp.h46
-rw-r--r--src/platform/windows/win_tcpconn.c75
-rw-r--r--src/platform/windows/win_tcpdial.c38
-rw-r--r--src/platform/windows/win_tcplisten.c18
8 files changed, 113 insertions, 123 deletions
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));