]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mount/network.c
mount.nfs: get_socket() may clobber errno, but preserves .re_errno
[nfs-utils.git] / utils / mount / network.c
index 89cb976d0fda0309666853d6a7d3baf510827eea..5a56c23ce20f9b9ca6333d9f1e08f837a8d18925 100644 (file)
@@ -210,9 +210,9 @@ out:
 }
 
 /*
- * Create a socket that is locally bound to a reserved or non-reserved
- * port. For any failures, RPC_ANYSOCK is returned which will cause 
- * the RPC code to create the socket instead. 
+ * Create a socket that is locally bound to a reserved or non-reserved port.
+ *
+ * The caller should check rpc_createerr to determine the cause of any error.
  */
 static int get_socket(struct sockaddr_in *saddr, unsigned int p_prot,
                        unsigned int timeout, int resvp, int conn)
@@ -310,19 +310,11 @@ static unsigned short getport(struct sockaddr_in *saddr,
 
        saddr->sin_port = htons(PMAPPORT);
 
-       /*
-        * Try to get a socket with a non-privileged port.
-        * clnt*create() will create one anyway if this
-        * fails.
-        */
        socket = get_socket(saddr, proto, PMAP_TIMEOUT, FALSE, FALSE);
        if (socket == RPC_ANYSOCK) {
-               if (proto == IPPROTO_TCP && errno == ETIMEDOUT) {
-                       /*
-                        * TCP SYN timed out, so exit now.
-                        */
+               if (proto == IPPROTO_TCP &&
+                   rpc_createerr.cf_error.re_errno == ETIMEDOUT)
                        rpc_createerr.cf_stat = RPC_TIMEDOUT;
-               }
                return 0;
        }
 
@@ -360,8 +352,7 @@ static unsigned short getport(struct sockaddr_in *saddr,
                else if (port == 0)
                        rpc_createerr.cf_stat = RPC_PROGNOTREGISTERED;
        }
-       if (socket != 1)
-               close(socket);
+       close(socket);
 
        return port;
 }
@@ -661,10 +652,10 @@ int clnt_ping(struct sockaddr_in *saddr, const unsigned long prog,
        static char clnt_res;
        struct sockaddr dissolve;
 
-       rpc_createerr.cf_stat = stat = errno = 0;
+       rpc_createerr.cf_stat = stat = 0;
        sock = get_socket(saddr, prot, CONNECT_TIMEOUT, FALSE, TRUE);
        if (sock == RPC_ANYSOCK) {
-               if (errno == ETIMEDOUT) {
+               if (rpc_createerr.cf_error.re_errno == ETIMEDOUT) {
                        /*
                         * TCP timeout. Bubble up the error to see 
                         * how it should be handled.