summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlaf Kirch <okir@suse.de>2008-09-16 10:23:48 -0400
committerSteve Dickson <steved@redhat.com>2008-09-16 10:23:48 -0400
commit566f261ff6bae2842e2e64aaf70d2e31acc1efe7 (patch)
tree8342f04a93ede13fa6038f4b4d927cb75135430f
parent1a94b830a6b5a248faa6fa0e4b7818d9394f6369 (diff)
downloadrpcbind-566f261ff6bae2842e2e64aaf70d2e31acc1efe7.tar.gz
Simplify port live check in pmap_svc.c
There's some hack in pmap_getport that will cause a service to be unregistered from the portmap list if we find the port is no longer in use. Apart from being a gross hack, it is also a rather inefficient hack. Since we now restrict pmap emulation to IPv4, we know the address is always 0.0.0.0, so no need to mess with uaddr strings. (The bind_check code is a huge messy no-op anyway, since all ports are added with bind_check = FALSE). Signed-off-by: okir@suse.de Signed-off-by: Steve Dickson <steved@redhat.com>
-rw-r--r--src/pmap_svc.c40
-rw-r--r--src/rpcbind.c5
-rw-r--r--src/rpcbind.h2
3 files changed, 13 insertions, 34 deletions
diff --git a/src/pmap_svc.c b/src/pmap_svc.c
index 02a57d2..7a4f059 100644
--- a/src/pmap_svc.c
+++ b/src/pmap_svc.c
@@ -293,40 +293,24 @@ pmapproc_getport(struct svc_req *rqstp /*__unused*/, SVCXPRT *xprt)
#endif
fnd = find_service_pmap(reg.pm_prog, reg.pm_vers, reg.pm_prot);
if (fnd) {
- char serveuaddr[32], *ua;
- char *pt1, *pt2;
+ char serveuaddr[32];
char *netid;
netid = pmap_ipprot2netid(reg.pm_prot);
- if (netid == NULL)
- goto sendreply;
- if (reg.pm_prot == IPPROTO_UDP) {
- ua = udp_uaddr;
- } else {
- ua = tcp_uaddr; /* To get the len */
- }
- if (ua == NULL) {
- goto sendreply;
- }
- if ((pt1 = strrchr(ua, '.')) != NULL) {
- *pt1 = 0;
- if ((pt2 = strrchr(ua, '.')) != NULL) {
- *pt2 = 0;
- snprintf(serveuaddr, sizeof serveuaddr,
- "%s.%ld.%ld", ua,
- (fnd->pml_map.pm_port >> 8) & 0xff,
- (fnd->pml_map.pm_port) & 0xff);
- *pt2 = '.';
- if (is_bound(netid, serveuaddr)) {
- port = fnd->pml_map.pm_port;
- } else { /* this service is dead; delete it */
- delete_prog(reg.pm_prog);
- }
+ if (netid != NULL) {
+ snprintf(serveuaddr, sizeof serveuaddr,
+ "0.0.0.0.%ld.%ld",
+ (fnd->pml_map.pm_port >> 8) & 0xff,
+ (fnd->pml_map.pm_port) & 0xff);
+
+ if (is_bound(netid, serveuaddr)) {
+ port = fnd->pml_map.pm_port;
+ } else { /* this service is dead; delete it */
+ delete_prog(reg.pm_prog);
}
- *pt1 = '.';
}
}
-sendreply:
+
lport = port;
if ((!svc_sendreply(xprt, (xdrproc_t) xdr_long, (caddr_t)&lport)) &&
debugging) {
diff --git a/src/rpcbind.c b/src/rpcbind.c
index dc6f66b..e0e7ddf 100644
--- a/src/rpcbind.c
+++ b/src/rpcbind.c
@@ -570,18 +570,15 @@ init_transport(struct netconfig *nconf)
pml->pml_map.pm_port = PMAPPORT;
pml->pml_map.pm_prot = si.si_proto;
- /* Stash away the universal address */
switch (si.si_proto) {
case IPPROTO_TCP:
tcptrans = strdup(nconf->nc_netid);
- tcp_uaddr = taddr2uaddr(nconf, &taddr.addr);
break;
case IPPROTO_UDP:
udptrans = strdup(nconf->nc_netid);
- udp_uaddr = taddr2uaddr(nconf, &taddr.addr);
break;
}
- pml->pml_next = list_pml;
+ pml->pml_next = list_pml;
list_pml = pml;
/* Add version 3 information */
diff --git a/src/rpcbind.h b/src/rpcbind.h
index 58ab3ef..295711a 100644
--- a/src/rpcbind.h
+++ b/src/rpcbind.h
@@ -76,8 +76,6 @@ extern rpcblist_ptr list_rbl; /* A list of version 3 & 4 rpcbind services */
extern struct pmaplist *list_pml; /* A list of version 2 rpcbind services */
extern char *udptrans; /* Name of UDP transport */
extern char *tcptrans; /* Name of TCP transport */
-extern char *udp_uaddr; /* Universal UDP address */
-extern char *tcp_uaddr; /* Universal TCP address */
extern char *pmap_ipprot2netid(unsigned long);
extern int pmap_netid2ipprot(const char *);
#endif