X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fmount%2Fnfsmount.c;h=a59d2c29271acda8b1a8975c55087f43aff7a21f;hp=9c08ff5837b22d4b18115e25a3e948ccade47edb;hb=6734ef89f4618f84e26f847b075f65f62ef086cf;hpb=0dfc8a5426381c6d65aed4d9d0e50bae3238cc8f diff --git a/utils/mount/nfsmount.c b/utils/mount/nfsmount.c index 9c08ff5..a59d2c2 100644 --- a/utils/mount/nfsmount.c +++ b/utils/mount/nfsmount.c @@ -89,6 +89,7 @@ typedef union { } mntres_t; extern int nfs_mount_data_version; +extern char *progname; extern int verbose; extern int sloppy; @@ -459,22 +460,22 @@ static int nfsmnt_check_compat(const struct pmap *nfs_pmap, unsigned int max_mnt_vers = (nfs_mount_data_version >= 4) ? 3 : 2; if (nfs_pmap->pm_vers == 4) { - fprintf(stderr, _("Please use '-t nfs4' " - "instead of '-o vers=4'.\n")); + nfs_error(_("%s: Please use '-t nfs4' " + "instead of '-o vers=4'"), progname); goto out_bad; } if (nfs_pmap->pm_vers) { if (nfs_pmap->pm_vers > max_nfs_vers || nfs_pmap->pm_vers < 2) { - fprintf(stderr, _("NFS version %ld is not supported.\n"), - nfs_pmap->pm_vers); + nfs_error(_("%s: NFS version %ld is not supported"), + progname, nfs_pmap->pm_vers); goto out_bad; } } if (mnt_pmap->pm_vers > max_mnt_vers) { - fprintf(stderr, _("NFS mount version %ld s not supported.\n"), - mnt_pmap->pm_vers); + nfs_error(_("%s: NFS mount version %ld s not supported"), + progname, mnt_pmap->pm_vers); goto out_bad; } @@ -485,16 +486,15 @@ out_bad: } int -nfsmount(const char *spec, const char *node, int *flags, - char **extra_opts, char **mount_opts, - int running_bg, int *need_statd) +nfsmount(const char *spec, const char *node, int flags, + char **extra_opts, int fake) { 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; + int val, running_bg = 0; static int doonce = 0; clnt_addr_t mnt_server = { &mounthost, }; @@ -517,8 +517,8 @@ nfsmount(const char *spec, const char *node, int *flags, time_t timeout; if (strlen(spec) >= sizeof(hostdir)) { - fprintf(stderr, _("mount: " - "excessively long host:dir argument\n")); + nfs_error(_("%s: excessively long host:dir argument"), + progname); goto fail; } strcpy(hostdir, spec); @@ -530,14 +530,13 @@ nfsmount(const char *spec, const char *node, int *flags, until they can be fully supported. (mack@sgi.com) */ if ((s = strchr(hostdir, ','))) { *s = '\0'; - fprintf(stderr, - _("mount: warning: " - "multiple hostnames not supported\n")); + nfs_error(_("%s: warning: " + "multiple hostnames not supported"), + progname); } } else { - fprintf(stderr, - _("mount: " - "directory to mount not in host:dir format\n")); + nfs_error(_("%s: directory to mount not in host:dir format"), + progname); goto fail; } @@ -617,9 +616,8 @@ nfsmount(const char *spec, const char *node, int *flags, #endif data.version = nfs_mount_data_version; - *mount_opts = (char *) &data; - if (*flags & MS_REMOUNT) + if (flags & MS_REMOUNT) goto out_ok; /* @@ -718,10 +716,9 @@ nfsmount(const char *spec, const char *node, int *flags, if (nfs_pmap->pm_vers == 2) { if (mntres.nfsv2.fhs_status != 0) { - fprintf(stderr, - _("mount: %s:%s failed, reason given by server: %s\n"), - hostname, dirname, - nfs_strerror(mntres.nfsv2.fhs_status)); + nfs_error(_("%s: %s:%s failed, reason given by server: %s"), + progname, hostname, dirname, + nfs_strerror(mntres.nfsv2.fhs_status)); goto fail; } memcpy(data.root.data, @@ -739,10 +736,9 @@ nfsmount(const char *spec, const char *node, int *flags, fhandle3 *fhandle; int i, *flavor, yum = 0; if (mntres.nfsv3.fhs_status != 0) { - fprintf(stderr, - _("mount: %s:%s failed, reason given by server: %s\n"), - hostname, dirname, - nfs_strerror(mntres.nfsv3.fhs_status)); + nfs_error(_("%s: %s:%s failed, reason given by server: %s"), + progname, hostname, dirname, + nfs_strerror(mntres.nfsv3.fhs_status)); goto fail; } #if NFS_MOUNT_VERSION >= 5 @@ -770,10 +766,9 @@ nfsmount(const char *spec, const char *node, int *flags, #endif } if (!yum) { - fprintf(stderr, - "mount: %s:%s failed, " - "security flavor not supported\n", - hostname, dirname); + nfs_error(_("%s: %s:%s failed, security flavor " + "not supported"), + progname, hostname, dirname); /* server has registered us in rmtab, send umount */ nfs_call_umount(&mnt_server, &dirname); goto fail; @@ -840,8 +835,8 @@ noauth_flavors: out_ok: /* Ensure we have enough padding for the following strcat()s */ if (strlen(new_opts) + strlen(s) + 30 >= sizeof(new_opts)) { - fprintf(stderr, _("mount: " - "excessively long option argument\n")); + nfs_error(_("%s: excessively long option argument"), + progname); goto fail; } @@ -849,7 +844,26 @@ noauth_flavors: strcat(new_opts, cbuf); *extra_opts = xstrdup(new_opts); - *need_statd = ! (data.flags & NFS_MOUNT_NONLM); + + if (!fake && !(data.flags & NFS_MOUNT_NONLM)) { + if (!start_statd()) { + nfs_error(_("%s: rpc.statd is not running but is " + "required for remote locking.\n" + " Either use '-o nolocks' to keep " + "locks local, or start statd."), + progname); + goto fail; + } + } + + if (!fake) { + if (mount(spec, node, "nfs", + flags & ~(MS_USER|MS_USERS), &data)) { + mount_error(spec, node, errno); + goto fail; + } + } + return 0; /* abort */