aboutsummaryrefslogtreecommitdiff
path: root/src/core/pipe.c
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2025-10-25 23:02:17 -0700
committerGarrett D'Amore <garrett@damore.org>2025-10-25 23:02:17 -0700
commitf9ff44ce0f0c73f05c182bb07c76bf6b51470560 (patch)
treebc37e151ab8527ca6df85ccb079c2b03673ba319 /src/core/pipe.c
parentc2aa8c12e705ba77f3d2d28c5ba0a9ec7efb7632 (diff)
downloadnng-f9ff44ce0f0c73f05c182bb07c76bf6b51470560.tar.gz
nng-f9ff44ce0f0c73f05c182bb07c76bf6b51470560.tar.bz2
nng-f9ff44ce0f0c73f05c182bb07c76bf6b51470560.zip
Plumb sockaddrs all the way through pipes, make them failsafe.
These functions can no longer fail.
Diffstat (limited to 'src/core/pipe.c')
-rw-r--r--src/core/pipe.c33
1 files changed, 23 insertions, 10 deletions
diff --git a/src/core/pipe.c b/src/core/pipe.c
index baa2d6f9..6a3a2e21 100644
--- a/src/core/pipe.c
+++ b/src/core/pipe.c
@@ -9,11 +9,13 @@
// found online at https://opensource.org/licenses/MIT.
//
+#include "core/options.h"
#include "nng/nng.h"
#include "nng_impl.h"
#include "sockimpl.h"
#include <stdio.h>
+#include <string.h>
// This file contains functions related to pipe objects.
//
@@ -345,6 +347,13 @@ nni_pipe_getopt(
if (rv != NNG_ENOTSUP) {
return (rv);
}
+ if (strcmp(name, NNG_OPT_REMADDR) == 0) {
+ return (
+ nni_copyout_sockaddr(nni_pipe_peer_addr(p), val, szp, t));
+ } else if (strcmp(name, NNG_OPT_LOCADDR) == 0) {
+ return (
+ nni_copyout_sockaddr(nni_pipe_self_addr(p), val, szp, t));
+ }
// Maybe the endpoint knows? The guarantees on pipes ensure that the
// pipe will not outlive its creating endpoint.
@@ -420,25 +429,29 @@ nni_pipe_bump_error(nni_pipe *p, int err)
}
}
+const nng_sockaddr *
+nni_pipe_peer_addr(nni_pipe *p)
+{
+ return (p->p_tran_ops.p_peer_addr(p->p_tran_data));
+}
+
+const nng_sockaddr *
+nni_pipe_self_addr(nni_pipe *p)
+{
+ return (p->p_tran_ops.p_self_addr(p->p_tran_data));
+}
+
char *
nni_pipe_peer_str_addr(nni_pipe *p, char buf[NNG_MAXADDRSTRLEN])
{
- nng_sockaddr sa;
- size_t sz = sizeof(sa);
- sa.s_family = AF_UNSPEC;
- nni_pipe_getopt(p, NNG_OPT_REMADDR, &sa, &sz, NNI_TYPE_SOCKADDR);
- nng_str_sockaddr(&sa, buf, NNG_MAXADDRSTRLEN);
+ nng_str_sockaddr(nni_pipe_peer_addr(p), buf, NNG_MAXADDRSTRLEN);
return (buf);
}
char *
nni_pipe_self_str_addr(nni_pipe *p, char buf[NNG_MAXADDRSTRLEN])
{
- nng_sockaddr sa;
- size_t sz = sizeof(sa);
- sa.s_family = AF_UNSPEC;
- nni_pipe_getopt(p, NNG_OPT_LOCADDR, &sa, &sz, NNI_TYPE_SOCKADDR);
- nng_str_sockaddr(&sa, buf, NNG_MAXADDRSTRLEN);
+ nng_str_sockaddr(nni_pipe_self_addr(p), buf, NNG_MAXADDRSTRLEN);
return (buf);
}