From 774ccd8224f8a6b76fce4204d3084ffb8cc09e5f Mon Sep 17 00:00:00 2001 From: Olaf Kirch Date: Tue, 20 Aug 2013 09:58:51 +0200 Subject: [PATCH 10/24] Fix the behavior when specifying the -h option Currently, when specifying the "-h" option, rpcbind will try to create sockets for all specified addresses, plus the loopback address. However, it will only register its programs on the last SVCXPRT created, which will usually be the first address specified via -h. This patch fixes this problem by introducing a new function that creates the socket *and* registers all programs, and use that from the while loop. Signed-off-by: Olaf Kirch --- src/rpcbind.c | 79 ++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 43 insertions(+), 36 deletions(-) diff --git a/src/rpcbind.c b/src/rpcbind.c index 25d12c9..c3679e2 100644 --- a/src/rpcbind.c +++ b/src/rpcbind.c @@ -562,6 +562,43 @@ rpcbind_register_transport(struct netconfig *nconf, SVCXPRT *xprt, struct netbuf } /* + * This will create a server socket for the given netid, bound to the + * address specified by @hostname + * + * Return value: + * 1: success + * 0: error - ignore this hostname + * <0: error - ignore this netid + */ +static int +rpcbind_init_endpoint(struct netconfig *nconf, const char *hostname) +{ + struct t_bind taddr; + SVCXPRT *my_xprt = NULL; + int r, fd = -1; + + memset(&taddr, 0, sizeof(taddr)); + + r = create_transport_socket(nconf, hostname, &taddr.addr, &fd); + if (r <= 0) + return r; + + my_xprt = (SVCXPRT *)svc_tli_create(fd, nconf, &taddr, RPC_MAXDATASIZE, RPC_MAXDATASIZE); + if (my_xprt == (SVCXPRT *)NULL) { + syslog(LOG_ERR, "%s: could not create service", nconf->nc_netid); + close(fd); + return 0; + } + + if (!rpcbind_register_transport(nconf, my_xprt, &taddr.addr)) { + svc_destroy(my_xprt); + return 0; + } + + return 1; +} + +/* * Adds the entry into the rpcbind database. * If PORTMAP, then for UDP and TCP, it adds the entries for version 2 also * Returns 0 if succeeds, else fails @@ -569,10 +606,7 @@ rpcbind_register_transport(struct netconfig *nconf, SVCXPRT *xprt, struct netbuf static int init_transport(struct netconfig *nconf) { - int fd = -1; - struct t_bind taddr; struct __rpc_sockinfo si; - SVCXPRT *my_xprt = NULL; int status; /* bound checking ? */ if ((nconf->nc_semantics != NC_TPI_CLTS) && @@ -635,42 +669,19 @@ init_transport(struct netconfig *nconf) if (strcmp("*", hosts[nhostsbak]) == 0) hosts[nhostsbak] = NULL; - memset(&taddr, 0, sizeof(taddr)); - - r = create_transport_socket(nconf, hosts[nhostsbak], &taddr.addr, &fd); + r = rpcbind_init_endpoint(nconf, hosts[nhostsbak]); if (r < 0) - goto error; - if (r == 0) - continue; - - my_xprt = (SVCXPRT *)svc_tli_create(fd, nconf, &taddr, - RPC_MAXDATASIZE, RPC_MAXDATASIZE); - if (my_xprt == (SVCXPRT *)NULL) { - syslog(LOG_ERR, "%s: could not create service", - nconf->nc_netid); - goto error; - } - checkbind = 1; - fd = -1; + return 1; + if (r > 0) + checkbind = 1; } if (!checkbind) return 1; } else { /* NC_TPI_COTS */ - memset(&taddr, 0, sizeof(taddr)); - if (create_transport_socket(nconf, NULL, &taddr.addr, &fd) <= 0) - goto error; - - my_xprt = (SVCXPRT *)svc_tli_create(fd, nconf, &taddr, RPC_MAXDATASIZE, RPC_MAXDATASIZE); - if (my_xprt == (SVCXPRT *)NULL) { - syslog(LOG_ERR, "%s: could not create service", - nconf->nc_netid); - goto error; - } + if (rpcbind_init_endpoint(nconf, NULL) <= 0) + return 1; } - if (!rpcbind_register_transport(nconf, my_xprt, &taddr.addr)) - return (1); - /* * rmtcall only supported on CLTS transports for now. */ @@ -691,10 +702,6 @@ init_transport(struct netconfig *nconf) #endif } return (0); -error: - if (fd >= 0) - close(fd); - return (1); } static void -- 1.7.12.4