diff options
Diffstat (limited to 'src/lib/rpc/svc_tcp.c')
-rw-r--r-- | src/lib/rpc/svc_tcp.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/src/lib/rpc/svc_tcp.c b/src/lib/rpc/svc_tcp.c index e20a29b..fe9b87f 100644 --- a/src/lib/rpc/svc_tcp.c +++ b/src/lib/rpc/svc_tcp.c @@ -174,6 +174,7 @@ svctcp_create(sock, sendsize, recvsize) xprt->xp_ops = &svctcp_rendezvous_op; xprt->xp_port = ntohs(addr.sin_port); xprt->xp_sock = sock; + xprt->xp_laddrlen = 0; xprt_register(xprt); return (xprt); } @@ -220,6 +221,7 @@ makefd_xprt(fd, sendsize, recvsize) xprt->xp_p1 = (caddr_t)cd; xprt->xp_verf.oa_base = cd->verf_body; xprt->xp_addrlen = 0; + xprt->xp_laddrlen = 0; xprt->xp_ops = &svctcp_op; /* truely deals with calls */ xprt->xp_port = 0; /* this is a connection, not a rendezvouser */ xprt->xp_sock = fd; @@ -234,24 +236,29 @@ rendezvous_request(xprt) { int sock; struct tcp_rendezvous *r; - struct sockaddr_in addr; - int len; + struct sockaddr_in addr, laddr; + int len, llen; r = (struct tcp_rendezvous *)xprt->xp_p1; again: - len = sizeof(struct sockaddr_in); + len = llen = sizeof(struct sockaddr_in); if ((sock = accept(xprt->xp_sock, (struct sockaddr *)&addr, &len)) < 0) { if (errno == EINTR) goto again; return (FALSE); } + if (getsockname(sock, &laddr, &llen) < 0) + return (FALSE); + /* * make a new transporter (re-uses xprt) */ xprt = makefd_xprt(sock, r->sendsize, r->recvsize); xprt->xp_raddr = addr; xprt->xp_addrlen = len; + xprt->xp_laddr = laddr; + xprt->xp_laddrlen = llen; return (FALSE); /* there is never an rpc msg to be processed */ } |