Add command line options to mount.nfs that allow it to prioritize DNS
resolution results for a server with interfaces registered for both
families.

Since this is a mount.nfs command line option and not something more
visible at higher levels (like as a mount option), consider this feature
useful mostly for testing.

Signed-off-by: Chuck Lever <[EMAIL PROTECTED]>
---

 utils/mount/mount.c       |   15 ++++++++++++++-
 utils/mount/mount.nfs.man |    8 ++++++++
 utils/mount/stropts.c     |    3 ++-
 3 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/utils/mount/mount.c b/utils/mount/mount.c
index 33d8d30..eecf1ad 100644
--- a/utils/mount/mount.c
+++ b/utils/mount/mount.c
@@ -54,6 +54,7 @@ int nomtab;
 int verbose;
 int sloppy;
 int string;
+int dnsfamily = AF_INET;
 
 #define FOREGROUND     (0)
 #define BACKGROUND     (1)
@@ -294,6 +295,10 @@ void mount_usage(void)
        printf(_("\t-v\t\tVerbose\n"));
        printf(_("\t-V\t\tPrint version\n"));
        printf(_("\t-w\t\tMount file system read-write\n"));
+#if IPV6_SUPPORTED
+       printf(_("\t-4\t\tFavor IPv4 DNS resolution results\n"));
+       printf(_("\t-6\t\tFavor IPv6 DNS resolution results\n"));
+#endif
        printf(_("\t-f\t\tFake mount, do not actually mount\n"));
        printf(_("\t-n\t\tDo not update /etc/mtab\n"));
        printf(_("\t-s\t\tTolerate sloppy mount options rather than fail\n"));
@@ -442,7 +447,7 @@ int main(int argc, char *argv[])
        mount_point = argv[2];
 
        argv[2] = argv[0]; /* so that getopt error messages are correct */
-       while ((c = getopt_long(argc - 2, argv + 2, "rvVwfno:hs",
+       while ((c = getopt_long(argc - 2, argv + 2, "rvVw46fno:hs",
                                longopts, NULL)) != -1) {
                switch (c) {
                case 'r':
@@ -457,6 +462,14 @@ int main(int argc, char *argv[])
                case 'w':
                        flags &= ~MS_RDONLY;
                        break;
+#if IPV6_SUPPORTED
+               case '4':
+                       dnsfamily = AF_INET;
+                       break;
+               case '6':
+                       dnsfamily = AF_INET6;
+                       break;
+#endif
                case 'f':
                        ++fake;
                        break;
diff --git a/utils/mount/mount.nfs.man b/utils/mount/mount.nfs.man
index 1a4561b..9526d9e 100644
--- a/utils/mount/mount.nfs.man
+++ b/utils/mount/mount.nfs.man
@@ -39,6 +39,14 @@ Print version.
 .BI "\-w"
 Mount file system read-write.
 .TP
+.BI "\-4"
+If a server has both IPv4 and IPv6 interfaces,
+favor IPv4 results when resolving the server's hostname to an IP address.
+.TP
+.BI "\-6"
+If a server has both IPv4 and IPv6 interfaces,
+favor IPv6 results when resolving the server's hostname to an IP address.
+.TP
 .BI "\-f"
 Fake mount. Don't actually call the mount system call.
 .TP
diff --git a/utils/mount/stropts.c b/utils/mount/stropts.c
index caf13b1..eef9ebf 100644
--- a/utils/mount/stropts.c
+++ b/utils/mount/stropts.c
@@ -71,6 +71,7 @@
 extern int nfs_mount_data_version;
 extern char *progname;
 extern int verbose;
+extern int dnsfamily;
 
 static int parse_devname(const char *spec, char **hostname)
 {
@@ -732,7 +733,7 @@ int nfsmount_string(const char *spec, const char *node, 
const char *type,
 
        if (!parse_devname(spec, &hostname))
                return retval;
-       if (nfs_name_to_address(hostname, AF_UNSPEC, saddr))
+       if (nfs_name_to_address(hostname, dnsfamily, saddr))
                goto fail;
 
        options = po_split(*extra_opts);

-
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to