X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fmount%2Fnetwork.c;h=e3ad5c26a71da5d915fe45f28ae5d32e8dbc9827;hp=7b1152a4b3fa479e121a8709af7a42dd40081c48;hb=e9ab22a79e385babb16623a9260bda358291c80d;hpb=57af0cce3ed6f555bb40132d667e8b10d41855ca diff --git a/utils/mount/network.c b/utils/mount/network.c index 7b1152a..e3ad5c2 100644 --- a/utils/mount/network.c +++ b/utils/mount/network.c @@ -193,8 +193,18 @@ static const unsigned int *nfs_default_proto() } #endif /* MOUNT_CONFIG */ -static int nfs_lookup(const char *hostname, const sa_family_t family, - struct sockaddr *sap, socklen_t *salen) +/** + * nfs_lookup - resolve hostname to an IPv4 or IPv6 socket address + * @hostname: pointer to C string containing DNS hostname to resolve + * @family: address family hint + * @sap: pointer to buffer to fill with socket address + * @len: IN: size of buffer to fill; OUT: size of socket address + * + * Returns 1 and places a socket address at @sap if successful; + * otherwise zero. + */ +int nfs_lookup(const char *hostname, const sa_family_t family, + struct sockaddr *sap, socklen_t *salen) { struct addrinfo *gai_results; struct addrinfo gai_hint = { @@ -242,25 +252,6 @@ static int nfs_lookup(const char *hostname, const sa_family_t family, return ret; } -/** - * nfs_name_to_address - resolve hostname to an IPv4 or IPv6 socket address - * @hostname: pointer to C string containing DNS hostname to resolve - * @sap: pointer to buffer to fill with socket address - * @len: IN: size of buffer to fill; OUT: size of socket address - * - * Returns 1 and places a socket address at @sap if successful; - * otherwise zero. - */ -int nfs_name_to_address(const char *hostname, - struct sockaddr *sap, socklen_t *salen) -{ -#ifdef IPV6_SUPPORTED - return nfs_lookup(hostname, AF_UNSPEC, sap, salen); -#else /* !IPV6_SUPPORTED */ - return nfs_lookup(hostname, AF_INET, sap, salen); -#endif /* !IPV6_SUPPORTED */ -} - /** * nfs_gethostbyname - resolve a hostname to an IPv4 address * @hostname: pointer to a C string containing a DNS hostname @@ -283,8 +274,8 @@ int nfs_gethostbyname(const char *hostname, struct sockaddr_in *sin) * OUT: length of converted socket address * * Convert a presentation format address string to a socket address. - * Similar to nfs_name_to_address(), but the DNS query is squelched, - * and won't make any noise if the getaddrinfo() call fails. + * Similar to nfs_lookup(), but the DNS query is squelched, and it + * won't make any noise if the getaddrinfo() call fails. * * Returns 1 and fills in @sap and @salen if successful; otherwise zero. * @@ -1289,6 +1280,7 @@ nfs_nfs_version(struct mount_options *options, unsigned long *version) int nfs_nfs_protocol(struct mount_options *options, unsigned long *protocol) { + sa_family_t family; char *option; switch (po_rightmost(options, nfs_transport_opttbl)) { @@ -1300,17 +1292,8 @@ nfs_nfs_protocol(struct mount_options *options, unsigned long *protocol) return 1; case 2: /* proto */ option = po_get(options, "proto"); - if (option) { - if (strcmp(option, "tcp") == 0) { - *protocol = IPPROTO_TCP; - return 1; - } - if (strcmp(option, "udp") == 0) { - *protocol = IPPROTO_UDP; - return 1; - } - return 0; - } + if (option != NULL) + return nfs_get_proto(option, &family, protocol); } /* @@ -1351,6 +1334,40 @@ nfs_nfs_port(struct mount_options *options, unsigned long *port) return 1; } +/* + * 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. @@ -1419,20 +1436,12 @@ nfs_mount_version(struct mount_options *options, unsigned long *version) static int nfs_mount_protocol(struct mount_options *options, unsigned long *protocol) { + sa_family_t family; char *option; option = po_get(options, "mountproto"); - if (option) { - if (strcmp(option, "tcp") == 0) { - *protocol = IPPROTO_TCP; - return 1; - } - if (strcmp(option, "udp") == 0) { - *protocol = IPPROTO_UDP; - return 1; - } - return 0; - } + if (option != NULL) + return nfs_get_proto(option, &family, protocol); /* * MNT transport protocol wasn't specified. If the NFS @@ -1472,6 +1481,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