mount.nfs: Add new API for getting protocol family from netids
authorChuck Lever <chuck.lever@oracle.com>
Fri, 11 Dec 2009 15:44:34 +0000 (10:44 -0500)
committerSteve Dickson <steved@redhat.com>
Fri, 11 Dec 2009 21:13:16 +0000 (16:13 -0500)
Introduce a couple of new functions that extract the protocol family
from the value of the proto= and mountproto= mount options.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Steve Dickson <steved@redhat.com>
utils/mount/network.c
utils/mount/network.h

index 7d9accd..d598fcf 100644 (file)
@@ -1354,6 +1354,40 @@ nfs_nfs_port(struct mount_options *options, unsigned long *port)
 }
 
 /*
+ * Returns TRUE and fills in @family if a valid NFS protocol option
+ * is found, or FALSE if the option was specified with an invalid value.
+ */
+int nfs_nfs_proto_family(struct mount_options *options,
+                               sa_family_t *family)
+{
+       unsigned long protocol;
+       char *option;
+
+#ifdef HAVE_LIBTIRPC
+       *family = AF_UNSPEC;
+#else
+       *family = AF_INET;
+#endif
+
+       switch (po_rightmost(options, nfs_transport_opttbl)) {
+       case 0: /* udp */
+               return 1;
+       case 1: /* tcp */
+               return 1;
+       case 2: /* proto */
+               option = po_get(options, "proto");
+               if (option != NULL)
+                       return nfs_get_proto(option, family, &protocol);
+       }
+
+       /*
+        * NFS transport protocol wasn't specified.  Return the
+        * default address family.
+        */
+       return 1;
+}
+
+/*
  * "mountprog" is supported only by the legacy mount command.  The
  * kernel mount client does not support this option.
  *
@@ -1466,6 +1500,35 @@ nfs_mount_port(struct mount_options *options, unsigned long *port)
        return 1;
 }
 
+/*
+ * Returns TRUE and fills in @family if a valid MNT protocol option
+ * is found, or FALSE if the option was specified with an invalid value.
+ */
+int nfs_mount_proto_family(struct mount_options *options,
+                               sa_family_t *family)
+{
+       unsigned long protocol;
+       char *option;
+
+#ifdef HAVE_LIBTIRPC
+       *family = AF_UNSPEC;
+#else
+       *family = AF_INET;
+#endif
+
+       option = po_get(options, "mountproto");
+       if (option != NULL)
+               return nfs_get_proto(option, family, &protocol);
+
+       /*
+        * MNT transport protocol wasn't specified.  If the NFS
+        * transport protocol was specified, derive the family
+        * from that; otherwise, return the default family for
+        * NFS.
+        */
+       return nfs_nfs_proto_family(options, family);
+}
+
 /**
  * nfs_options2pmap - set up pmap structs based on mount options
  * @options: pointer to mount options
index 2cdf02e..da095e3 100644 (file)
@@ -58,6 +58,8 @@ int clnt_ping(struct sockaddr_in *, const unsigned long,
 
 struct mount_options;
 
+int nfs_nfs_proto_family(struct mount_options *options, sa_family_t *family);
+int nfs_mount_proto_family(struct mount_options *options, sa_family_t *family);
 int nfs_nfs_version(struct mount_options *options, unsigned long *version);
 int  nfs_nfs_protocol(struct mount_options *options, unsigned long *protocol);