text-based mount.nfs: combine nfsmount_s() and nfs4mount_s() paths
authorChuck Lever <chuck.lever@oracle.com>
Mon, 8 Oct 2007 15:53:51 +0000 (11:53 -0400)
committerNeil Brown <neilb@suse.de>
Tue, 9 Oct 2007 01:18:04 +0000 (11:18 +1000)
The top-level logic that handles text-based mount options is mostly the
same for NFS and NFSv4 mounts.  To improve maintainability, let's combine
the nfsmount_s() and nfs4mount_s() functions.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Neil Brown <neilb@suse.de>
utils/mount/mount.c
utils/mount/stropts.c
utils/mount/stropts.h

index e622231..21946f7 100644 (file)
@@ -376,14 +376,10 @@ static int try_mount(char *spec, char *mount_point, int flags,
 {
        int ret;
 
-       if (string) {
-               if (strcmp(fs_type, "nfs4") == 0)
-                       ret = nfs4mount_s(spec, mount_point, flags,
-                                               extra_opts, fake, bg);
-               else
-                       ret = nfsmount_s(spec, mount_point, flags,
-                                               extra_opts, fake, bg);
-       } else {
+       if (string)
+               ret = nfsmount_string(spec, mount_point, fs_type, flags,
+                                       extra_opts, fake, bg);
+       else {
                if (strcmp(fs_type, "nfs4") == 0)
                        ret = nfs4mount(spec, mount_point, flags,
                                        extra_opts, fake, bg);
index 6270312..8859bf5 100644 (file)
@@ -365,3 +365,62 @@ out:
        po_destroy(options);
        return retval;
 }
+
+/**
+ * nfsmount_string - Mount an NFS file system using C string options
+ * @spec: C string specifying remote share to mount ("hostname:path")
+ * @node: C string pathname of local mounted-on directory
+ * @type: C string that represents file system type ("nfs" or "nfs4")
+ * @flags: MS_ style mount flags
+ * @extra_opts:        pointer to C string containing fs-specific mount options
+ *             (input and output argument)
+ * @fake: flag indicating whether to carry out the whole operation
+ * @child: one if this is a mount daemon (bg)
+ */
+int nfsmount_string(const char *spec, const char *node, const char *type,
+                   int flags, char **extra_opts, int fake, int child)
+{
+       struct mount_options *options = NULL;
+       struct sockaddr_in saddr;
+       char *hostname;
+       int err, retval = EX_FAIL;
+
+       if (!parse_devname(spec, &hostname))
+               goto out;
+       err = fill_ipv4_sockaddr(hostname, &saddr);
+       free(hostname);
+       if (!err)
+               goto out;
+
+       options = po_split(*extra_opts);
+       if (!options) {
+               nfs_error(_("%s: internal option parsing error"), progname);
+               goto out;
+       }
+
+       if (!set_mandatory_options(type, &saddr, options))
+               goto out;
+
+       if (po_join(options, extra_opts) == PO_FAILED) {
+               nfs_error(_("%s: internal option parsing error"), progname);
+               goto out;
+       }
+
+       if (verbose)
+               printf(_("%s: text-based options: '%s'\n"),
+                       progname, *extra_opts);
+
+       if (!fake) {
+               if (mount(spec, node, type,
+                               flags & ~(MS_USER|MS_USERS), *extra_opts)) {
+                       mount_error(spec, node, errno);
+                       goto out;
+               }
+       }
+
+       retval = EX_SUCCESS;
+
+out:
+       po_destroy(options);
+       return retval;
+}
index a2a0604..b926d68 100644 (file)
@@ -21,5 +21,5 @@
  *
  */
 
-int nfsmount_s(const char *, const char *, int , char **, int, int);
-int nfs4mount_s(const char *, const char *, int, char **, int, int);
+int nfsmount_string(const char *, const char *, const char *, int,
+                       char **, int, int);