]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mount/nfsmount.c
Currently nfs4mount() sets the retry value to 10000 on both fg and bg
[nfs-utils.git] / utils / mount / nfsmount.c
index 49d6f3c875f9ca2bb0b798880514600a8c997cd5..a9dd91764fbb7276521245885133c928640966f7 100644 (file)
  * nfsmount.c,v 1.1.1.1 1993/11/18 08:40:51 jrs Exp
  */
 
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
 #include <ctype.h>
 #include <unistd.h>
 #include <stdio.h>
@@ -56,7 +60,6 @@
 #include <paths.h>
 #include <syslog.h>
 
-#include "conn.h"
 #include "xcommon.h"
 #include "mount.h"
 #include "nfs_mount.h"
@@ -191,7 +194,6 @@ parse_options(char *old_opts, struct nfs_mount_data *data,
                if ((opteq = strchr(opt, '=')) && isdigit(opteq[1])) {
                        int val = atoi(opteq + 1);      
                        *opteq = '\0';
-/* printf("opt=%s\n", opt); */
                        if (!strcmp(opt, "rsize"))
                                data->rsize = val;
                        else if (!strcmp(opt, "wsize"))
@@ -433,7 +435,7 @@ parse_options(char *old_opts, struct nfs_mount_data *data,
                                                val ? "" : "no", opt);
                                goto out_bad;
                        }
-                       sprintf(cbuf, val ? "%s,":"no%s,", opt);
+                       sprintf(cbuf, val ? "%s," : "no%s,", opt);
                }
                len += strlen(cbuf);
                if (len >= opt_size) {
@@ -477,7 +479,7 @@ static int nfsmnt_check_compat(const struct pmap *nfs_pmap,
        }
 
        if (mnt_pmap->pm_vers > max_mnt_vers) {
-               nfs_error(_("%s: NFS mount version %ld s not supported"),
+               nfs_error(_("%s: NFS mount version %ld is not supported"),
                                progname, mnt_pmap->pm_vers);
                goto out_bad;
        }
@@ -490,14 +492,14 @@ out_bad:
 
 int
 nfsmount(const char *spec, const char *node, int flags,
-        char **extra_opts, int fake)
+        char **extra_opts, int fake, int running_bg)
 {
        static char *prev_bg_host;
        char hostdir[1024];
        char *hostname, *dirname, *old_opts, *mounthost = NULL;
        char new_opts[1024], cbuf[1024];
        static struct nfs_mount_data data;
-       int val, running_bg = 0;
+       int val;
        static int doonce = 0;
 
        clnt_addr_t mnt_server = { &mounthost, };
@@ -569,7 +571,7 @@ nfsmount(const char *spec, const char *node, int flags,
 #endif
 
        bg = 0;
-       retry = 10000;          /* 10000 minutes ~ 1 week */
+       retry = -1;
 
        memset(mnt_pmap, 0, sizeof(*mnt_pmap));
        mnt_pmap->pm_prog = MOUNTPROG;
@@ -583,37 +585,40 @@ nfsmount(const char *spec, const char *node, int flags,
                goto fail;
        if (!nfsmnt_check_compat(nfs_pmap, mnt_pmap))
                goto fail;
-       
-       if (retry == 10000 && !bg)
-               retry = 2; /* reset for fg mounts */
-       
+
+       if (retry == -1) {
+               if (bg)
+                       retry = 10000;  /* 10000 mins == ~1 week*/
+               else
+                       retry = 2;      /* 2 min default on fg mounts */
+       }
 
 #ifdef NFS_MOUNT_DEBUG
-       printf("rsize = %d, wsize = %d, timeo = %d, retrans = %d\n",
+       printf(_("rsize = %d, wsize = %d, timeo = %d, retrans = %d\n"),
               data.rsize, data.wsize, data.timeo, data.retrans);
-       printf("acreg (min, max) = (%d, %d), acdir (min, max) = (%d, %d)\n",
+       printf(_("acreg (min, max) = (%d, %d), acdir (min, max) = (%d, %d)\n"),
               data.acregmin, data.acregmax, data.acdirmin, data.acdirmax);
-       printf("port = %d, bg = %d, retry = %d, flags = %.8x\n",
+       printf(_("port = %lu, bg = %d, retry = %d, flags = %.8x\n"),
               nfs_pmap->pm_port, bg, retry, data.flags);
-       printf("mountprog = %d, mountvers = %d, nfsprog = %d, nfsvers = %d\n",
+       printf(_("mountprog = %lu, mountvers = %lu, nfsprog = %lu, nfsvers = %lu\n"),
               mnt_pmap->pm_prog, mnt_pmap->pm_vers,
               nfs_pmap->pm_prog, nfs_pmap->pm_vers);
-       printf("soft = %d, intr = %d, posix = %d, nocto = %d, noac = %d ",
+       printf(_("soft = %d, intr = %d, posix = %d, nocto = %d, noac = %d"),
               (data.flags & NFS_MOUNT_SOFT) != 0,
               (data.flags & NFS_MOUNT_INTR) != 0,
               (data.flags & NFS_MOUNT_POSIX) != 0,
               (data.flags & NFS_MOUNT_NOCTO) != 0,
               (data.flags & NFS_MOUNT_NOAC) != 0);
 #if NFS_MOUNT_VERSION >= 2
-       printf("tcp = %d ",
+       printf(_(", tcp = %d"),
               (data.flags & NFS_MOUNT_TCP) != 0);
 #endif
 #if NFS_MOUNT_VERSION >= 4
-       printf("noacl = %d ", (data.flags & NFS_MOUNT_NOACL) != 0);
+       printf(_(", noacl = %d"), (data.flags & NFS_MOUNT_NOACL) != 0);
 #endif
 #if NFS_MOUNT_VERSION >= 5
-       printf("sec = %u ", data.pseudoflavor);
-       printf("readdirplus = %d ", (data.flags & NFS_MOUNT_NORDIRPLUS) != 0);
+       printf(_(", sec = %u"), data.pseudoflavor);
+       printf(_(", readdirplus = %d"), (data.flags & NFS_MOUNT_NORDIRPLUS) != 0);
 #endif
        printf("\n");
 #endif
@@ -691,15 +696,15 @@ nfsmount(const char *spec, const char *node, int flags,
                                if (errno == ETIMEDOUT)
                                        break;
                        default:
-                               mount_errors(*nfs_server.hostname, 0, bg);
+                               rpc_mount_errors(*nfs_server.hostname, 0, bg);
                        goto fail;
                        }
                        t = time(NULL);
                        if (t >= timeout) {
-                               mount_errors(*nfs_server.hostname, 0, bg);
+                               rpc_mount_errors(*nfs_server.hostname, 0, bg);
                                goto fail;
                        }
-                       mount_errors(*nfs_server.hostname, 1, bg);
+                       rpc_mount_errors(*nfs_server.hostname, 1, bg);
                        continue;
                }
                if (!running_bg) {
@@ -710,14 +715,14 @@ nfsmount(const char *spec, const char *node, int flags,
                }
                t = time(NULL);
                if (t >= timeout) {
-                       mount_errors(*nfs_server.hostname, 0, bg);
+                       rpc_mount_errors(*nfs_server.hostname, 0, bg);
                        goto fail;
                }
                if (doonce++ < 1)
-                       mount_errors(*nfs_server.hostname, 1, bg);
+                       rpc_mount_errors(*nfs_server.hostname, 1, bg);
        }
 
-       if (nfs_pmap->pm_vers == 2) {
+       if (mnt_pmap->pm_vers <= 2) {
                if (mntres.nfsv2.fhs_status != 0) {
                        nfs_error(_("%s: %s:%s failed, reason given by server: %s"),
                                        progname, hostname, dirname,
@@ -737,7 +742,7 @@ nfsmount(const char *spec, const char *node, int flags,
 #if NFS_MOUNT_VERSION >= 4
                mountres3_ok *mountres;
                fhandle3 *fhandle;
-               int i, *flavor, yum = 0;
+               int i,  n_flavors, *flavor, yum = 0;
                if (mntres.nfsv3.fhs_status != 0) {
                        nfs_error(_("%s: %s:%s failed, reason given by server: %s"),
                                        progname, hostname, dirname,
@@ -746,13 +751,16 @@ nfsmount(const char *spec, const char *node, int flags,
                }
 #if NFS_MOUNT_VERSION >= 5
                mountres = &mntres.nfsv3.mountres3_u.mountinfo;
-               i = mountres->auth_flavors.auth_flavors_len;
-               if (i <= 0)
+               n_flavors = mountres->auth_flavors.auth_flavors_len;
+               if (n_flavors <= 0)
                        goto noauth_flavors;
 
                flavor = mountres->auth_flavors.auth_flavors_val;
-               while (--i >= 0) {
-                       /* If no flavour requested, use first simple
+               for (i = 0; i < n_flavors; ++i) {
+                       /*
+                        * Per RFC2623, section 2.7, we should prefer the
+                        * flavour listed first.
+                        * If no flavour requested, use the first simple
                         * flavour that is offered.
                         */
                        if (! (data.flags & NFS_MOUNT_SECFLAVOUR) &&
@@ -764,8 +772,7 @@ nfsmount(const char *spec, const char *node, int flags,
                        if (flavor[i] == data.pseudoflavor)
                                yum = 1;
 #ifdef NFS_MOUNT_DEBUG
-                       printf("auth flavor %d: %d\n",
-                               i, flavor[i]);
+                       printf(_("auth flavor %d: %d\n"), i, flavor[i]);
 #endif
                }
                if (!yum) {
@@ -807,7 +814,7 @@ noauth_flavors:
        }
 
 #ifdef NFS_MOUNT_DEBUG
-       printf(_("using port %d for nfs deamon\n"), nfs_pmap->pm_port);
+       printf(_("using port %lu for nfs deamon\n"), nfs_pmap->pm_port);
 #endif
        nfs_saddr->sin_port = htons(nfs_pmap->pm_port);
        /*
@@ -852,7 +859,7 @@ noauth_flavors:
                if (!start_statd()) {
                        nfs_error(_("%s: rpc.statd is not running but is "
                                "required for remote locking.\n"
-                               "   Either use '-o nolocks' to keep "
+                               "   Either use '-o nolock' to keep "
                                "locks local, or start statd."),
                                        progname);
                        goto fail;
@@ -867,7 +874,7 @@ noauth_flavors:
                }
        }
 
-       return 0;
+       return EX_SUCCESS;
 
        /* abort */
  fail: