]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mount/network.c
mount command: remove local getport() implementation
[nfs-utils.git] / utils / mount / network.c
index 223121092bedbbd7e16b8cafacaa88b63355c3b1..0c68993c0e06a7e287483e6abcc53ee65b0b2ea9 100644 (file)
@@ -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.