aboutsummaryrefslogtreecommitdiff
path: root/src/platform
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2018-12-22 19:23:26 -0800
committerGitHub <noreply@github.com>2018-12-22 19:23:26 -0800
commitee16d11a59120cd4d981e0dcb90741fa4141372a (patch)
tree98da4bc9601f30e2c9deb403fe213c9fb4335597 /src/platform
parentd00483eadbee48b820a8a79163c5296953b6f5cb (diff)
downloadnng-ee16d11a59120cd4d981e0dcb90741fa4141372a.tar.gz
nng-ee16d11a59120cd4d981e0dcb90741fa4141372a.tar.bz2
nng-ee16d11a59120cd4d981e0dcb90741fa4141372a.zip
fixes #823 Define public IPC (#824)
This introduces a basic IPC API, modeled on the TCP API, for direct access. Only connection options are exposed at present -- we need to add options for dialers and listeners (and particularly listener settings for permissions and security attributes.) Documentation is still outstanding, but a very limited test suite exists.
Diffstat (limited to 'src/platform')
-rw-r--r--src/platform/posix/posix_ipcconn.c93
-rw-r--r--src/platform/windows/win_impl.h4
-rw-r--r--src/platform/windows/win_ipc.h38
-rw-r--r--src/platform/windows/win_ipcconn.c48
-rw-r--r--src/platform/windows/win_ipcdial.c17
-rw-r--r--src/platform/windows/win_ipclisten.c13
-rw-r--r--src/platform/windows/win_sockaddr.c5
7 files changed, 170 insertions, 48 deletions
diff --git a/src/platform/posix/posix_ipcconn.c b/src/platform/posix/posix_ipcconn.c
index 0dae8bae..595ebe62 100644
--- a/src/platform/posix/posix_ipcconn.c
+++ b/src/platform/posix/posix_ipcconn.c
@@ -1,6 +1,7 @@
//
// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
+// Copyright 2018 Devolutions <infos@devolutions.net>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
@@ -10,8 +11,6 @@
#include "core/nng_impl.h"
-#ifdef NNG_PLATFORM_POSIX
-
#include <errno.h>
#include <fcntl.h>
#include <poll.h>
@@ -40,6 +39,8 @@
#include "posix_ipc.h"
+#include <nng/transport/ipc/ipc.h>
+
static void
ipc_conn_dowrite(nni_ipc_conn *c)
{
@@ -464,6 +465,19 @@ nni_ipc_conn_get_peer_pid(nni_ipc_conn *c, uint64_t *pid)
}
int
+nni_ipc_conn_sockname(nni_ipc_conn *c, nni_sockaddr *sa)
+{
+ struct sockaddr_storage ss;
+ socklen_t sslen = sizeof(ss);
+ int fd = nni_posix_pfd_fd(c->pfd);
+
+ if (getsockname(fd, (void *) &ss, &sslen) != 0) {
+ return (nni_plat_errno(errno));
+ }
+ return (nni_posix_sockaddr2nn(sa, &ss));
+}
+
+int
nni_posix_ipc_conn_init(nni_ipc_conn **cp, nni_posix_pfd *pfd)
{
nni_ipc_conn *c;
@@ -502,4 +516,77 @@ nni_ipc_conn_fini(nni_ipc_conn *c)
NNI_FREE_STRUCT(c);
}
-#endif // NNG_PLATFORM_POSIX
+int
+nni_ipc_conn_setopt(
+ nni_ipc_conn *c, const char *name, const void *val, size_t sz)
+{
+ NNI_ARG_UNUSED(c);
+ NNI_ARG_UNUSED(val);
+ NNI_ARG_UNUSED(sz);
+ if ((strcmp(name, NNG_OPT_LOCADDR) == 0) ||
+ (strcmp(name, NNG_OPT_REMADDR) == 0) ||
+ (strcmp(name, NNG_OPT_IPC_PEER_PID) == 0) ||
+ (strcmp(name, NNG_OPT_IPC_PEER_UID) == 0) ||
+ (strcmp(name, NNG_OPT_IPC_PEER_GID) == 0) ||
+ (strcmp(name, NNG_OPT_IPC_PEER_ZONEID) == 0)) {
+ return (NNG_EREADONLY);
+ }
+ return (NNG_ENOTSUP);
+}
+
+int
+nni_ipc_conn_getopt(nni_ipc_conn *c, const char *name, void *val, size_t *szp)
+{
+ int rv;
+ uint64_t *idp = val;
+
+ if ((strcmp(name, NNG_OPT_LOCADDR) == 0) ||
+ (strcmp(name, NNG_OPT_REMADDR) == 0)) {
+ nng_sockaddr *sa = val;
+ if (*szp < sizeof(*sa)) {
+ return (NNG_EINVAL);
+ }
+
+ if ((rv = nni_ipc_conn_sockname(c, sa)) == 0) {
+ *szp = sizeof(*sa);
+ }
+ return (rv);
+ }
+ if (strcmp(name, NNG_OPT_IPC_PEER_PID) == 0) {
+ if (*szp < sizeof(*idp)) {
+ return (NNG_EINVAL);
+ }
+ if ((rv = nni_ipc_conn_get_peer_pid(c, idp)) == 0) {
+ *szp = sizeof(*idp);
+ }
+ return (rv);
+ }
+ if (strcmp(name, NNG_OPT_IPC_PEER_UID) == 0) {
+ if (*szp < sizeof(*idp)) {
+ return (NNG_EINVAL);
+ }
+ if ((rv = nni_ipc_conn_get_peer_uid(c, idp)) == 0) {
+ *szp = sizeof(*idp);
+ }
+ return (rv);
+ }
+ if (strcmp(name, NNG_OPT_IPC_PEER_GID) == 0) {
+ if (*szp < sizeof(*idp)) {
+ return (NNG_EINVAL);
+ }
+ if ((rv = nni_ipc_conn_get_peer_gid(c, idp)) == 0) {
+ *szp = sizeof(*idp);
+ }
+ return (rv);
+ }
+ if (strcmp(name, NNG_OPT_IPC_PEER_ZONEID) == 0) {
+ if (*szp < sizeof(*idp)) {
+ return (NNG_EINVAL);
+ }
+ if ((rv = nni_ipc_conn_get_peer_zoneid(c, idp)) == 0) {
+ *szp = sizeof(*idp);
+ }
+ return (rv);
+ }
+ return (NNG_ENOTSUP);
+}
diff --git a/src/platform/windows/win_impl.h b/src/platform/windows/win_impl.h
index 462e1707..fd4c9343 100644
--- a/src/platform/windows/win_impl.h
+++ b/src/platform/windows/win_impl.h
@@ -11,8 +11,6 @@
#ifndef PLATFORM_WIN_IMPL_H
#define PLATFORM_WIN_IMPL_H
-#ifdef NNG_PLATFORM_WINDOWS
-
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
@@ -106,6 +104,4 @@ extern int nni_win_nn2sockaddr(SOCKADDR_STORAGE *, const nni_sockaddr *);
#define NNG_PLATFORM_DIR_SEP "\\"
-#endif // NNG_PLATFORM_WINDOWS
-
#endif // PLATFORM_WIN_IMPL_H
diff --git a/src/platform/windows/win_ipc.h b/src/platform/windows/win_ipc.h
index 51ce5548..9a4e245a 100644
--- a/src/platform/windows/win_ipc.h
+++ b/src/platform/windows/win_ipc.h
@@ -1,6 +1,7 @@
//
// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
+// Copyright 2018 Devolutions <infos@devolutions.net>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
@@ -14,26 +15,27 @@
// This header file is private to the IPC (named pipes) support for Windows.
#include "core/nng_impl.h"
+#include "win_impl.h"
-#ifdef NNG_PLATFORM_WINDOWS
+#define IPC_PIPE_PREFIX "\\\\.\\pipe\\"
struct nni_ipc_conn {
- HANDLE f;
- 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;
- nni_ipc_dialer * dialer;
- nni_ipc_listener *listener;
- int recv_rv;
- int send_rv;
- int conn_rv;
- bool closed;
- nni_mtx mtx;
- nni_cv cv;
- nni_reap_item reap;
+ HANDLE f;
+ 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 sa;
+ bool dialer;
+ int recv_rv;
+ int send_rv;
+ int conn_rv;
+ bool closed;
+ nni_mtx mtx;
+ nni_cv cv;
+ nni_reap_item reap;
};
struct nni_ipc_dialer {
@@ -57,6 +59,4 @@ struct nni_ipc_listener {
extern int nni_win_ipc_conn_init(nni_ipc_conn **, HANDLE);
-#endif // NNG_PLATFORM_WINDOWS
-
#endif // NNG_PLATFORM_WIN_WINIPC_H
diff --git a/src/platform/windows/win_ipcconn.c b/src/platform/windows/win_ipcconn.c
index d4e7f5ac..107ffb9d 100644
--- a/src/platform/windows/win_ipcconn.c
+++ b/src/platform/windows/win_ipcconn.c
@@ -1,6 +1,7 @@
//
// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
+// Copyright 2018 Devolutions <infos@devolutions.net>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
@@ -10,12 +11,12 @@
#include "core/nng_impl.h"
-#ifdef NNG_PLATFORM_WINDOWS
-
#include "win_ipc.h"
#include <stdio.h>
+#include <nng/transport/ipc/ipc.h>
+
static void
ipc_recv_start(nni_ipc_conn *c)
{
@@ -385,4 +386,45 @@ nni_ipc_conn_get_peer_pid(nni_ipc_conn *c, uint64_t *pid)
return (0);
}
-#endif // NNG_PLATFORM_WINDOWS
+int
+nni_ipc_conn_setopt(
+ nni_ipc_conn *c, const char *name, const void *val, size_t sz)
+{
+ NNI_ARG_UNUSED(c);
+ NNI_ARG_UNUSED(val);
+ NNI_ARG_UNUSED(sz);
+ if ((strcmp(name, NNG_OPT_LOCADDR) == 0) ||
+ (strcmp(name, NNG_OPT_REMADDR) == 0) ||
+ (strcmp(name, NNG_OPT_IPC_PEER_PID) == 0)) {
+ return (NNG_EREADONLY);
+ }
+ return (NNG_ENOTSUP);
+}
+
+int
+nni_ipc_conn_getopt(nni_ipc_conn *c, const char *name, void *val, size_t *szp)
+{
+ if ((strcmp(name, NNG_OPT_LOCADDR) == 0) ||
+ (strcmp(name, NNG_OPT_REMADDR) == 0)) {
+ if (*szp < sizeof(c->sa)) {
+ return (NNG_EINVAL);
+ }
+
+ memcpy(val, &c->sa, sizeof(c->sa));
+ *szp = sizeof(c->sa);
+ return (0);
+ }
+ if (strcmp(name, NNG_OPT_IPC_PEER_PID) == 0) {
+ int rv;
+ uint64_t *idp = val;
+ if (*szp < sizeof(*idp)) {
+ return (NNG_EINVAL);
+ }
+ if ((rv = nni_ipc_conn_get_peer_pid(c, idp)) == 0) {
+ ;
+ *szp = sizeof(*idp);
+ }
+ return (rv);
+ }
+ return (NNG_ENOTSUP);
+}
diff --git a/src/platform/windows/win_ipcdial.c b/src/platform/windows/win_ipcdial.c
index 67865687..4c3d5c6c 100644
--- a/src/platform/windows/win_ipcdial.c
+++ b/src/platform/windows/win_ipcdial.c
@@ -10,8 +10,6 @@
#include "core/nng_impl.h"
-#ifdef NNG_PLATFORM_WINDOWS
-
#include "win_ipc.h"
#include <stdio.h>
@@ -108,16 +106,21 @@ ipc_dial_thr(void *arg)
nni_list_remove(&d->aios, aio);
nni_aio_set_prov_extra(aio, 0, NULL);
- nni_strfree(path);
if (((rv = nni_win_io_register(f)) != 0) ||
((rv = nni_win_ipc_conn_init(&c, f)) != 0)) {
DisconnectNamedPipe(f);
CloseHandle(f);
nni_aio_finish_error(aio, rv);
+ nni_strfree(path);
continue;
}
- c->dialer = d;
+ c->dialer = true;
+ c->sa.s_ipc.sa_family = NNG_AF_IPC;
+ snprintf(c->sa.s_ipc.sa_path,
+ sizeof(c->sa.s_ipc.sa_path), "%s",
+ path + strlen(IPC_PIPE_PREFIX));
+ nni_strfree(path);
nni_aio_set_output(aio, 0, c);
nni_aio_finish(aio, 0, 0);
}
@@ -169,8 +172,8 @@ nni_ipc_dialer_dial(nni_ipc_dialer *d, const nni_sockaddr *sa, nni_aio *aio)
nni_aio_finish_error(aio, NNG_EADDRINVAL);
return;
}
- if ((rv = nni_asprintf(&path, "\\\\.\\pipe\\%s", sa->s_ipc.sa_path)) !=
- 0) {
+ if ((rv = nni_asprintf(
+ &path, IPC_PIPE_PREFIX "%s", sa->s_ipc.sa_path)) != 0) {
nni_aio_finish_error(aio, rv);
return;
}
@@ -261,5 +264,3 @@ nni_win_ipc_sysfini(void)
nni_cv_fini(&worker->cv);
nni_mtx_fini(&worker->mtx);
}
-
-#endif // NNG_PLATFORM_WINDOWS
diff --git a/src/platform/windows/win_ipclisten.c b/src/platform/windows/win_ipclisten.c
index 0fc1c9fc..d0fd6ef9 100644
--- a/src/platform/windows/win_ipclisten.c
+++ b/src/platform/windows/win_ipclisten.c
@@ -10,8 +10,6 @@
#include "core/nng_impl.h"
-#ifdef NNG_PLATFORM_WINDOWS
-
#include "win_ipc.h"
#include <stdio.h>
@@ -58,8 +56,11 @@ ipc_accept_done(nni_ipc_listener *l, int rv)
nni_aio_finish_error(aio, rv);
return;
}
- l->f = f;
- c->listener = l;
+ l->f = f;
+ c->sa.s_ipc.sa_family = NNG_AF_IPC;
+ snprintf(c->sa.s_ipc.sa_path, sizeof(c->sa.s_ipc.sa_path), "%s",
+ l->path + strlen(IPC_PIPE_PREFIX));
+ c->dialer = false;
nni_aio_set_output(aio, 0, c);
nni_aio_finish(aio, 0, 0);
}
@@ -185,7 +186,7 @@ nni_ipc_listener_listen(nni_ipc_listener *l, const nni_sockaddr *sa)
nni_mtx_unlock(&l->mtx);
return (NNG_ECLOSED);
}
- rv = nni_asprintf(&path, "\\\\.\\pipe\\%s", sa->s_ipc.sa_path);
+ rv = nni_asprintf(&path, IPC_PIPE_PREFIX "%s", sa->s_ipc.sa_path);
if (rv != 0) {
nni_mtx_unlock(&l->mtx);
return (rv);
@@ -292,5 +293,3 @@ nni_ipc_listener_fini(nni_ipc_listener *l)
nni_mtx_fini(&l->mtx);
NNI_FREE_STRUCT(l);
}
-
-#endif // NNG_PLATFORM_WINDOWS
diff --git a/src/platform/windows/win_sockaddr.c b/src/platform/windows/win_sockaddr.c
index fbb960b7..d1fed2c7 100644
--- a/src/platform/windows/win_sockaddr.c
+++ b/src/platform/windows/win_sockaddr.c
@@ -9,8 +9,7 @@
//
#include "core/nng_impl.h"
-
-#ifdef NNG_PLATFORM_WINDOWS
+#include "win_impl.h"
#include <string.h>
@@ -69,5 +68,3 @@ nni_win_sockaddr2nn(nni_sockaddr *sa, const SOCKADDR_STORAGE *ss)
}
return (-1);
}
-
-#endif // NNG_PLATFORM_WINDOWS