X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fmount%2Fstropts.c;h=b2b56bed874bc590b362ce31e3ae241b717a0d24;hp=2d717fb296cde6ed9d9426339c6628e350b2c1ab;hb=331c2ca949d5b4b4d18d0aca90afb8ae9475bcd6;hpb=ec565223d509f1537c38ae01d330fb24e4305da9 diff --git a/utils/mount/stropts.c b/utils/mount/stropts.c index 2d717fb..b2b56be 100644 --- a/utils/mount/stropts.c +++ b/utils/mount/stropts.c @@ -21,6 +21,10 @@ * */ +#ifdef HAVE_CONFIG_H +#include +#endif + #include #include #include @@ -214,14 +218,35 @@ static int fix_mounthost_option(struct mount_options *options) return 0; } +/* + * Returns zero if the "lock" option is in effect, but statd + * can't be started. Otherwise, returns 1. + */ +static int verify_lock_option(struct mount_options *options) +{ + if (po_rightmost(options, "nolock", "lock") == PO_KEY1_RIGHTMOST) + return 1; + + if (!start_statd()) { + nfs_error(_("%s: rpc.statd is not running but is " + "required for remote locking."), progname); + nfs_error(_("%s: Either use '-o nolock' to keep " + "locks local, or start statd."), progname); + return 0; + } + + return 1; +} + /* * Set up mandatory mount options. * * Returns 1 if successful; otherwise zero. */ -static int set_mandatory_options(const char *type, - struct sockaddr_in *saddr, - struct mount_options *options) +static int validate_options(const char *type, + struct sockaddr_in *saddr, + struct mount_options *options, + int fake) { if (!append_addr_option(saddr, options)) return 0; @@ -232,6 +257,8 @@ static int set_mandatory_options(const char *type, } else { if (!fix_mounthost_option(options)) return 0; + if (!fake && !verify_lock_option(options)) + return 0; } return 1; @@ -248,7 +275,6 @@ static int set_mandatory_options(const char *type, static int is_permanent_error(int error) { switch (error) { - case EACCES: case ESTALE: case ETIMEDOUT: case ECONNREFUSED: @@ -304,9 +330,6 @@ static struct mount_options *rewrite_mount_options(char *str) if (option) mnt_server.pmap.pm_port = atoi(option); mnt_server.pmap.pm_prog = MOUNTPROG; - option = po_get(options, "mountprog"); - if (option) - mnt_server.pmap.pm_prog = atoi(option); option = po_get(options, "mountvers"); if (option) mnt_server.pmap.pm_vers = atoi(option); @@ -317,9 +340,6 @@ static struct mount_options *rewrite_mount_options(char *str) po_remove_all(options, "port"); } nfs_server.pmap.pm_prog = NFS_PROGRAM; - option = po_get(options, "nfsprog"); - if (option) - nfs_server.pmap.pm_prog = atoi(option); option = po_get(options, "nfsvers"); if (option) { @@ -681,32 +701,32 @@ int nfsmount_string(const char *spec, const char *node, const char *type, struct mount_options *options = NULL; struct sockaddr_in saddr; char *hostname; - int err, retval = EX_FAIL; + int retval = EX_FAIL; if (!parse_devname(spec, &hostname)) - goto out; - err = fill_ipv4_sockaddr(hostname, &saddr); - free(hostname); - if (!err) - goto out; + return retval; + if (!fill_ipv4_sockaddr(hostname, &saddr)) + goto fail; options = po_split(*extra_opts); if (!options) { nfs_error(_("%s: internal option parsing error"), progname); - goto out; + goto fail; } - if (!set_mandatory_options(type, &saddr, options)) + if (!validate_options(type, &saddr, options, fake)) goto out; - if (try_mount(spec, node, type, flags, options, fake, extra_opts)) { - mount_error(spec, node, errno); - goto out; - } - - retval = EX_SUCCESS; + if (po_rightmost(options, "bg", "fg") == PO_KEY1_RIGHTMOST) + retval = nfsmount_bg(spec, node, type, hostname, flags, + options, fake, child, extra_opts); + else + retval = nfsmount_fg(spec, node, type, flags, options, + fake, extra_opts); out: po_destroy(options); +fail: + free(hostname); return retval; }