From 424c2238c97d26d8d5fb30fb1449a96396269da0 Mon Sep 17 00:00:00 2001 From: Garrett D'Amore Date: Sun, 2 Jul 2017 12:58:53 -0700 Subject: Transports allocate their pipe structures during connect & accept. --- src/transport/tcp/tcp.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) (limited to 'src/transport/tcp/tcp.c') diff --git a/src/transport/tcp/tcp.c b/src/transport/tcp/tcp.c index 4aecef65..d366a496 100644 --- a/src/transport/tcp/tcp.c +++ b/src/transport/tcp/tcp.c @@ -92,7 +92,7 @@ nni_tcp_pipe_fini(void *arg) static int -nni_tcp_pipe_init(void **argp) +nni_tcp_pipe_init(nni_tcp_pipe **pipep) { nni_tcp_pipe *pipe; int rv; @@ -114,7 +114,7 @@ nni_tcp_pipe_init(void **argp) if (rv != 0) { goto fail; } - *argp = pipe; + *pipep = pipe; return (0); fail: @@ -484,10 +484,10 @@ nni_tcp_negotiate(nni_tcp_pipe *pipe) static int -nni_tcp_ep_connect(void *arg, void *pipearg) +nni_tcp_ep_connect(void *arg, void **pipep) { nni_tcp_ep *ep = arg; - nni_tcp_pipe *pipe = pipearg; + nni_tcp_pipe *pipe; char *host; uint16_t port; int flag; @@ -531,6 +531,9 @@ nni_tcp_ep_connect(void *arg, void *pipearg) return (rv); } + if ((rv = nni_tcp_pipe_init(&pipe)) != 0) { + return (rv); + } pipe->proto = ep->proto; pipe->rcvmax = ep->rcvmax; @@ -540,12 +543,15 @@ nni_tcp_ep_connect(void *arg, void *pipearg) bindaddr = lclpart == NULL ? NULL : &lcladdr; rv = nni_plat_tcp_connect(pipe->tsp, &remaddr, bindaddr); if (rv != 0) { + nni_tcp_pipe_fini(pipe); return (rv); } if ((rv = nni_tcp_negotiate(pipe)) != 0) { + nni_tcp_pipe_fini(pipe); return (rv); } + *pipep = pipe; return (0); } @@ -582,27 +588,33 @@ nni_tcp_ep_bind(void *arg) static int -nni_tcp_ep_accept(void *arg, void *pipearg) +nni_tcp_ep_accept(void *arg, void **pipep) { nni_tcp_ep *ep = arg; - nni_tcp_pipe *pipe = pipearg; + nni_tcp_pipe *pipe; int rv; + if ((rv = nni_tcp_pipe_init(&pipe)) != 0) { + return (rv); + } pipe->proto = ep->proto; pipe->rcvmax = ep->rcvmax; + if ((rv = nni_plat_tcp_accept(pipe->tsp, ep->tsp)) != 0) { + nni_tcp_pipe_fini(pipe); return (rv); } if ((rv = nni_tcp_negotiate(pipe)) != 0) { + nni_tcp_pipe_fini(pipe); return (rv); } + *pipep = pipe; return (0); } static nni_tran_pipe nni_tcp_pipe_ops = { - .p_init = nni_tcp_pipe_init, .p_fini = nni_tcp_pipe_fini, .p_aio_send = nni_tcp_pipe_aio_send, .p_aio_recv = nni_tcp_pipe_aio_recv, -- cgit v1.2.3-70-g09d2