]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mount/stropts.c
Make the text-based mount path check whether statd is running if the "lock"
[nfs-utils.git] / utils / mount / stropts.c
index 31df51b958b8d08be9b28b1428759d1cd1b53b71..b2b56bed874bc590b362ce31e3ae241b717a0d24 100644 (file)
  *
  */
 
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
 #include <ctype.h>
 #include <unistd.h>
 #include <stdio.h>
@@ -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);
@@ -691,7 +714,7 @@ int nfsmount_string(const char *spec, const char *node, const char *type,
                goto fail;
        }
 
-       if (!set_mandatory_options(type, &saddr, options))
+       if (!validate_options(type, &saddr, options, fake))
                goto out;
 
        if (po_rightmost(options, "bg", "fg") == PO_KEY1_RIGHTMOST)