]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mount/stropts.c
nfs-utils: Collect socket address helpers into one location
[nfs-utils.git] / utils / mount / stropts.c
index c5b92fc12f4f58633d5fd17b37acf68aa23e8b4e..57a4b32df3babb364a717bd560afb35e269e38c3 100644 (file)
@@ -35,6 +35,7 @@
 #include <netinet/in.h>
 #include <arpa/inet.h>
 
+#include "sockaddr.h"
 #include "xcommon.h"
 #include "mount.h"
 #include "nls.h"
@@ -77,12 +78,6 @@ extern char *progname;
 extern int verbose;
 extern int sloppy;
 
-union nfs_sockaddr {
-       struct sockaddr         sa;
-       struct sockaddr_in      s4;
-       struct sockaddr_in6     s6;
-};
-
 struct nfsmount_info {
        const char              *spec,          /* server:/path */
                                *node,          /* mounted-on dir */
@@ -225,21 +220,33 @@ static int nfs_append_clientaddr_option(const struct sockaddr *sap,
 }
 
 /*
- * Resolve the 'mounthost=' hostname and append a new option using
- * the resulting address.
+ * Determine whether to append a 'mountaddr=' option.  The option is needed if:
+ *
+ *   1. "mounthost=" was specified, or
+ *   2. The address families for proto= and mountproto= are different.
  */
-static int nfs_fix_mounthost_option(struct mount_options *options)
+static int nfs_fix_mounthost_option(struct mount_options *options,
+               const char *nfs_hostname)
 {
        union nfs_sockaddr address;
        struct sockaddr *sap = &address.sa;
        socklen_t salen = sizeof(address);
+       sa_family_t nfs_family, mnt_family;
        char *mounthost;
 
+       if (!nfs_nfs_proto_family(options, &nfs_family))
+               return 0;
+       if (!nfs_mount_proto_family(options, &mnt_family))
+               return 0;
+
        mounthost = po_get(options, "mounthost");
-       if (!mounthost)
-               return 1;
+       if (mounthost == NULL) {
+               if (nfs_family == mnt_family)
+                       return 1;
+               mounthost = (char *)nfs_hostname;
+       }
 
-       if (!nfs_name_to_address(mounthost, sap, &salen)) {
+       if (!nfs_lookup(mounthost, mnt_family, sap, &salen)) {
                nfs_error(_("%s: unable to determine mount server's address"),
                                progname);
                return 0;
@@ -327,12 +334,15 @@ static int nfs_set_version(struct nfsmount_info *mi)
 static int nfs_validate_options(struct nfsmount_info *mi)
 {
        struct sockaddr *sap = &mi->address.sa;
+       sa_family_t family;
 
        if (!nfs_parse_devname(mi->spec, &mi->hostname, NULL))
                return 0;
 
+       if (!nfs_nfs_proto_family(mi->options, &family))
+               return 0;
        mi->salen = sizeof(mi->address);
-       if (!nfs_name_to_address(mi->hostname, sap, &mi->salen))
+       if (!nfs_lookup(mi->hostname, family, sap, &mi->salen))
                return 0;
 
        if (!nfs_set_version(mi))
@@ -565,7 +575,7 @@ static int nfs_try_mount_v3v2(struct nfsmount_info *mi)
                return result;
        }
 
-       if (!nfs_fix_mounthost_option(options)) {
+       if (!nfs_fix_mounthost_option(options, mi->hostname)) {
                errno = EINVAL;
                goto out_fail;
        }