X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fmount%2Fnetwork.c;h=0c68993c0e06a7e287483e6abcc53ee65b0b2ea9;hp=223121092bedbbd7e16b8cafacaa88b63355c3b1;hb=b8711a0665b9ecff9d59ee36d756f50823242f64;hpb=14b0dae49afae3fcf05c19ae84829aeef2f6876e diff --git a/utils/mount/network.c b/utils/mount/network.c index 2231210..0c68993 100644 --- a/utils/mount/network.c +++ b/utils/mount/network.c @@ -449,76 +449,25 @@ err_connect: return RPC_ANYSOCK; } -/* - * getport() is very similar to pmap_getport() with the exception that - * this version tries to use an ephemeral port, since reserved ports are - * not needed for GETPORT queries. This conserves the very limited - * reserved port space, which helps reduce failed socket binds - * during mount storms. - * - * A side effect of calling this function is that rpccreateerr is set. - */ -static unsigned short getport(struct sockaddr_in *saddr, - unsigned long program, - unsigned long version, - unsigned int proto) +static void nfs_pp_debug(const struct sockaddr *sap, const socklen_t salen, + const rpcprog_t program, const rpcvers_t version, + const unsigned short protocol, + const unsigned short port) { - struct sockaddr_in bind_saddr; - unsigned short port = 0; - int socket; - CLIENT *clnt = NULL; - enum clnt_stat stat; - - bind_saddr = *saddr; - bind_saddr.sin_port = htons(PMAPPORT); - - socket = get_socket(&bind_saddr, proto, PMAP_TIMEOUT, FALSE, TRUE); - if (socket == RPC_ANYSOCK) { - if (proto == IPPROTO_TCP && - rpc_createerr.cf_error.re_errno == ETIMEDOUT) - rpc_createerr.cf_stat = RPC_TIMEDOUT; - return 0; - } + char buf[NI_MAXHOST]; - switch (proto) { - case IPPROTO_UDP: - clnt = clntudp_bufcreate(&bind_saddr, - PMAPPROG, PMAPVERS, - RETRY_TIMEOUT, &socket, - RPCSMALLMSGSIZE, - RPCSMALLMSGSIZE); - break; - case IPPROTO_TCP: - clnt = clnttcp_create(&bind_saddr, - PMAPPROG, PMAPVERS, - &socket, - RPCSMALLMSGSIZE, RPCSMALLMSGSIZE); - break; - } - if (clnt != NULL) { - struct pmap parms = { - .pm_prog = program, - .pm_vers = version, - .pm_prot = proto, - }; - - stat = clnt_call(clnt, PMAPPROC_GETPORT, - (xdrproc_t)xdr_pmap, (caddr_t)&parms, - (xdrproc_t)xdr_u_short, (caddr_t)&port, - TIMEOUT); - if (stat) { - clnt_geterr(clnt, &rpc_createerr.cf_error); - rpc_createerr.cf_stat = stat; - } - clnt_destroy(clnt); - if (stat != RPC_SUCCESS) - port = 0; - else if (port == 0) - rpc_createerr.cf_stat = RPC_PROGNOTREGISTERED; + if (!verbose) + return; + + if (nfs_present_sockaddr(sap, salen, buf, sizeof(buf)) == 0) { + buf[0] = '\0'; + strcat(buf, "unknown host"); } - close(socket); - return port; + fprintf(stderr, _("%s: trying %s prog %ld vers %ld prot %s port %d\n"), + progname, buf, program, version, + (protocol == IPPROTO_UDP ? _("UDP") : _("TCP")), + port); } /* @@ -529,7 +478,8 @@ static unsigned short getport(struct sockaddr_in *saddr, static int probe_port(clnt_addr_t *server, const unsigned long *versions, const unsigned int *protos) { - struct sockaddr_in *saddr = &server->saddr; + const struct sockaddr *saddr = (struct sockaddr *)&server->saddr; + const socklen_t salen = sizeof(server->saddr); struct pmap *pmap = &server->pmap; const unsigned long prog = pmap->pm_prog, *p_vers; const unsigned int prot = (u_int)pmap->pm_prot, *p_prot; @@ -541,21 +491,14 @@ static int probe_port(clnt_addr_t *server, const unsigned long *versions, p_vers = vers ? &vers : versions; rpc_createerr.cf_stat = 0; for (;;) { - p_port = getport(saddr, prog, *p_vers, *p_prot); + p_port = nfs_getport(saddr, salen, prog, *p_vers, *p_prot); if (p_port) { if (!port || port == p_port) { - saddr->sin_port = htons(p_port); - if (verbose) { - printf(_("%s: trying %s prog %ld vers " - "%ld prot %s port %d\n"), - progname, - inet_ntoa(saddr->sin_addr), - prog, *p_vers, - *p_prot == IPPROTO_UDP ? - _("UDP") : _("TCP"), - p_port); - } - if (clnt_ping(saddr, prog, *p_vers, *p_prot, NULL)) + server->saddr.sin_port = htons(p_port); + nfs_pp_debug(saddr, salen, prog, *p_vers, + *p_prot, p_port); + if (nfs_rpc_ping(saddr, salen, prog, + *p_vers, *p_prot, NULL)) goto out_ok; } } @@ -828,9 +771,9 @@ void mnt_closeclnt(CLIENT *clnt, int msock) * @prot: target RPC protocol * @caddr: filled in with our network address * - * Sigh... getport() doesn't actually check the version number. + * Sigh... GETPORT queries don't actually check the version number. * In order to make sure that the server actually supports the service - * we're requesting, we open and RPC client, and fire off a NULL + * we're requesting, we open an RPC client, and fire off a NULL * RPC call. * * caddr is the network address that the server will use to call us back.