From 159dc95695515db767e208c41d5f44b334b71adc Mon Sep 17 00:00:00 2001 From: Garrett D'Amore Date: Wed, 2 May 2018 16:01:22 -0700 Subject: fixes #389 Need pipe notification callbacks This adds a new pipe event notification API (callbacks called on either pipe add or remove), including both tests and docs. Also supporting APIs to get the socket or endpoint associated with a pipe are included (tested and documented as well.) --- src/nng.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) (limited to 'src/nng.c') diff --git a/src/nng.c b/src/nng.c index 4dc6c3fa..9e010978 100644 --- a/src/nng.c +++ b/src/nng.c @@ -1014,6 +1014,24 @@ nng_getopt_string(nng_socket s, const char *name, char **valp) return (nng_getx(s, name, valp, &sz, NNI_TYPE_STRING)); } +int +nng_pipe_notify(nng_socket s, nng_pipe_cb cb, void *arg) +{ + int rv; + nni_sock *sock; + + if ((rv = nni_init()) != 0) { + return (rv); + } + if ((rv = nni_sock_find(&sock, s.id)) != 0) { + return (rv); + } + + nni_sock_set_pipe_cb(sock, cb, arg); + nni_sock_rele(sock); + return (0); +} + int nng_device(nng_socket s1, nng_socket s2) { @@ -1190,6 +1208,47 @@ nng_pipe_getopt_string(nng_pipe p, const char *name, char **valp) return (nng_pipe_getx(p, name, valp, &sz, NNI_TYPE_STRING)); } +nng_socket +nng_pipe_socket(nng_pipe p) +{ + nng_socket s = NNG_SOCKET_INITIALIZER; + nni_pipe * pipe; + + if ((nni_init() == 0) && (nni_pipe_find(&pipe, p.id) == 0)) { + s.id = nni_pipe_sock_id(pipe); + nni_pipe_rele(pipe); + } + return (s); +} + +nng_dialer +nng_pipe_dialer(nng_pipe p) +{ + nng_dialer d = NNG_DIALER_INITIALIZER; + nni_pipe * pipe; + if ((nni_init() == 0) && (nni_pipe_find(&pipe, p.id) == 0)) { + if (nni_pipe_ep_mode(pipe) == NNI_EP_MODE_DIAL) { + d.id = nni_pipe_ep_id(pipe); + } + nni_pipe_rele(pipe); + } + return (d); +} + +nng_listener +nng_pipe_listener(nng_pipe p) +{ + nng_listener l = NNG_LISTENER_INITIALIZER; + nni_pipe * pipe; + if ((nni_init() == 0) && (nni_pipe_find(&pipe, p.id) == 0)) { + if (nni_pipe_ep_mode(pipe) == NNI_EP_MODE_LISTEN) { + l.id = nni_pipe_ep_id(pipe); + } + nni_pipe_rele(pipe); + } + return (l); +} + int nng_pipe_close(nng_pipe p) { -- cgit v1.2.3-70-g09d2