summaryrefslogtreecommitdiff
path: root/src/sp
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2023-12-29 15:35:43 -0800
committerGarrett D'Amore <garrett@damore.org>2023-12-29 15:35:43 -0800
commit25bde0dcefca6da42d4168f54692204c83fe2ba4 (patch)
tree750711fa338e573c3d15b5f55b5cdcdb6e587176 /src/sp
parentfeb51d0931c30f58c87caafaf24ed345d27b324b (diff)
downloadnng-25bde0dcefca6da42d4168f54692204c83fe2ba4.tar.gz
nng-25bde0dcefca6da42d4168f54692204c83fe2ba4.tar.bz2
nng-25bde0dcefca6da42d4168f54692204c83fe2ba4.zip
ipc: refactor get peerid support to use common POSIX code
This eliminates some code. A test is added as well, so this should help with coverage.
Diffstat (limited to 'src/sp')
-rw-r--r--src/sp/transport/ipc/ipc_test.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/sp/transport/ipc/ipc_test.c b/src/sp/transport/ipc/ipc_test.c
index 2fb4afa3..b39aa937 100644
--- a/src/sp/transport/ipc/ipc_test.c
+++ b/src/sp/transport/ipc/ipc_test.c
@@ -379,6 +379,60 @@ test_unix_alias(void)
#endif
}
+void
+test_ipc_pipe_peer(void)
+{
+#ifdef NNG_PLATFORM_POSIX
+ // this test verifies that closing a socket peer
+ // during negotiation is ok.
+ nng_socket s0, s1;
+ nng_msg *msg;
+ nng_pipe p;
+ uint64_t id;
+ char *addr;
+
+ NUTS_ADDR(addr, "ipc");
+ NUTS_OPEN(s0);
+ NUTS_PASS(nng_listen(s0, addr, NULL, 0));
+ NUTS_OPEN(s1);
+ NUTS_PASS(nng_dial(s1, addr, NULL, 0));
+
+ NUTS_PASS(nng_socket_set_ms(s0, NNG_OPT_SENDTIMEO, 1000));
+ NUTS_PASS(nng_socket_set_ms(s0, NNG_OPT_RECVTIMEO, 1000));
+ NUTS_PASS(nng_socket_set_ms(s1, NNG_OPT_SENDTIMEO, 1000));
+ NUTS_PASS(nng_socket_set_ms(s1, NNG_OPT_RECVTIMEO, 1000));
+
+ NUTS_SEND(s0, "something");
+ NUTS_PASS(nng_recvmsg(s1, &msg, 0));
+ p = nng_msg_get_pipe(msg);
+ NUTS_ASSERT(nng_pipe_id(p) != -1);
+#if defined(NNG_PLATFORM_DARWIN) || defined(NNG_PLATFORM_LINUX)
+ NUTS_PASS(nng_pipe_get_uint64(p, NNG_OPT_PEER_PID, &id));
+ NUTS_ASSERT(id == (uint64_t) getpid());
+#endif
+#if defined(NNG_PLATFORM_DARWIN) || defined(NNG_PLATFORM_LINUX)
+ NUTS_PASS(nng_pipe_get_uint64(p, NNG_OPT_PEER_UID, &id));
+ NUTS_ASSERT(id == (uint64_t) getuid());
+#endif
+#if defined(NNG_PLATFORM_DARWIN) || defined(NNG_PLATFORM_LINUX)
+ NUTS_PASS(nng_pipe_get_uint64(p, NNG_OPT_PEER_GID, &id));
+ NUTS_ASSERT(id == (uint64_t) getgid());
+#endif
+#if defined(NNG_PLATFORM_SUNOS)
+ NUTS_PASS(nng_pipe_get_uint64(p, NNG_OPT_PEER_ZONEID, &id));
+ NUTS_ASSERT(id == (uint64_t) getzoneid());
+#else
+ NUTS_FAIL(
+ nng_pipe_get_uint64(p, NNG_OPT_PEER_ZONEID, &id), NNG_ENOTSUP);
+#endif
+
+ nng_msg_free(msg);
+ NUTS_CLOSE(s0);
+ NUTS_CLOSE(s1);
+#endif // NNG_PLATFORM_POSIX
+}
+
+
TEST_LIST = {
{ "ipc path too long", test_path_too_long },
{ "ipc dialer perms", test_ipc_dialer_perms },
@@ -391,5 +445,6 @@ TEST_LIST = {
{ "ipc abstract name too long", test_abstract_too_long },
{ "ipc abstract embedded null", test_abstract_null },
{ "ipc unix alias", test_unix_alias },
+ { "ipc peer id", test_ipc_pipe_peer },
{ NULL, NULL },
}; \ No newline at end of file