X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fmount%2Fnfsmount.c;h=a9dd91764fbb7276521245885133c928640966f7;hp=49d6f3c875f9ca2bb0b798880514600a8c997cd5;hb=5f7cc524008a7dc548a71f4c7b0d39759371a37a;hpb=a3c8371b4f4cf9f0ff93ca040cac13dc4806ded9 diff --git a/utils/mount/nfsmount.c b/utils/mount/nfsmount.c index 49d6f3c..a9dd917 100644 --- a/utils/mount/nfsmount.c +++ b/utils/mount/nfsmount.c @@ -35,6 +35,10 @@ * nfsmount.c,v 1.1.1.1 1993/11/18 08:40:51 jrs Exp */ +#ifdef HAVE_CONFIG_H +#include +#endif + #include #include #include @@ -56,7 +60,6 @@ #include #include -#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: