]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mount/nfs4mount.c
proper merge
[nfs-utils.git] / utils / mount / nfs4mount.c
index c4e8bfb0a3ba7d1a04339604d8e6db55fbeb13a7..028e7cd5447e16a8b20e50efa67ec703cca3f3d6 100644 (file)
  * - Moved to nfs-utils/utils/mount from util-linux/mount.
  */
 
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
 #include <unistd.h>
 #include <stdio.h>
 #include <string.h>
@@ -30,6 +34,7 @@
 #include <arpa/inet.h>
 #include <rpc/auth.h>
 #include <rpc/rpc.h>
+
 #ifdef HAVE_RPCSVC_NFS_PROT_H
 #include <rpcsvc/nfs_prot.h>
 #else
@@ -41,6 +46,7 @@
 #include "nls.h"
 #include "xcommon.h"
 
+#include "mount.h"
 #include "mount_constants.h"
 #include "nfs4_mount.h"
 #include "nfs_mount.h"
@@ -140,7 +146,7 @@ static int fill_ipv4_sockaddr(const char *hostname, struct sockaddr_in *addr)
                                progname, hostname);
                return -1;
        }
-       if (hp->h_length > sizeof(struct in_addr)) {
+       if (hp->h_length > (int)sizeof(struct in_addr)) {
                nfs_error(_("%s: got bad hp->h_length"), progname);
                hp->h_length = sizeof(struct in_addr);
        }
@@ -184,10 +190,9 @@ int nfs4mount(const char *spec, const char *node, int flags,
        int bg, soft, intr;
        int nocto, noac, unshared;
        int retry;
-       int retval;
+       int retval = EX_FAIL;
        time_t timeout, t;
 
-       retval = EX_FAIL;
        if (strlen(spec) >= sizeof(hostdir)) {
                nfs_error(_("%s: excessively long host:dir argument\n"),
                                progname);
@@ -212,8 +217,11 @@ int nfs4mount(const char *spec, const char *node, int flags,
                                progname);
                goto fail;
        }
-       snprintf(new_opts, sizeof(new_opts), "%s%saddr=%s",
-                old_opts, *old_opts ? "," : "", s);
+       if (running_bg)
+               strncpy(new_opts, old_opts, sizeof(new_opts));
+       else
+               snprintf(new_opts, sizeof(new_opts), "%s%saddr=%s",
+                        old_opts, *old_opts ? "," : "", s);
        *extra_opts = xstrdup(new_opts);
 
        /* Set default options.
@@ -234,7 +242,7 @@ int nfs4mount(const char *spec, const char *node, int flags,
        nocto = 0;
        noac = 0;
        unshared = 0;
-       retry = 10000;          /* 10000 minutes ~ 1 week */
+       retry = -1;
 
        /*
         * NFSv4 specifies that the default port should be 2049
@@ -328,6 +336,14 @@ int nfs4mount(const char *spec, const char *node, int flags,
                }
        }
 
+       /* if retry is still -1, then it wasn't set via an option */
+       if (retry == -1) {
+               if (bg)
+                       retry = 10000;  /* 10000 mins == ~1 week */
+               else
+                       retry = 2;      /* 2 min default on fg mounts */
+       }
+
        data.flags = (soft ? NFS4_MOUNT_SOFT : 0)
                | (intr ? NFS4_MOUNT_INTR : 0)
                | (nocto ? NFS4_MOUNT_NOCTO : 0)
@@ -421,22 +437,31 @@ int nfs4mount(const char *spec, const char *node, int flags,
                        break;
                }
 
-               switch(rpc_createerr.cf_stat){
-               case RPC_TIMEDOUT:
-                       break;
-               case RPC_SYSTEMERROR:
-                       if (errno == ETIMEDOUT)
+               if (!bg) {
+                       switch(rpc_createerr.cf_stat) {
+                       case RPC_TIMEDOUT:
                                break;
-               default:
-                       mount_errors(hostname, 0, bg);
+                       case RPC_SYSTEMERROR:
+                               if (errno == ETIMEDOUT)
+                                       break;
+                       default:
+                               rpc_mount_errors(hostname, 0, bg);
+                               goto fail;
+                       }
+               }
+
+               if (bg && !running_bg) {
+                       if (retry > 0)
+                               retval = EX_BG;
                        goto fail;
                }
+
                t = time(NULL);
                if (t >= timeout) {
-                       mount_errors(hostname, 0, bg);
+                       rpc_mount_errors(hostname, 0, bg);
                        goto fail;
                }
-               mount_errors(hostname, 1, bg);
+               rpc_mount_errors(hostname, 1, bg);
                continue;
        }
 
@@ -448,7 +473,7 @@ int nfs4mount(const char *spec, const char *node, int flags,
                }
        }
 
-       return 0;
+       return EX_SUCCESS;
 
 fail:
        return retval;