X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;ds=sidebyside;f=utils%2Fmount%2Fnetwork.c;h=7d9accd19f56ead4410906fb7394edc20a142b87;hb=9889b48572e672f4535ca9dafd98d81146b7b834;hp=1a053519718437f2c5c8b73c7b5a2396c66404e2;hpb=2f61f62ac777cc03e30513f6fd3699f9e2f04e27;p=nfs-utils.git diff --git a/utils/mount/network.c b/utils/mount/network.c index 1a05351..7d9accd 100644 --- a/utils/mount/network.c +++ b/utils/mount/network.c @@ -50,6 +50,7 @@ #include "nfsrpc.h" #include "parse_opt.h" #include "network.h" +#include "conffile.h" #define PMAP_TIMEOUT (10) #define CONNECT_TIMEOUT (20) @@ -171,8 +172,39 @@ static const unsigned long probe_mnt3_first[] = { 0, }; -static int nfs_lookup(const char *hostname, const sa_family_t family, - struct sockaddr *sap, socklen_t *salen) +static const unsigned int *nfs_default_proto(void); +#ifdef MOUNT_CONFIG +static const unsigned int *nfs_default_proto() +{ + extern unsigned long config_default_proto; + /* + * If the default proto has been set and + * its not TCP, start with UDP + */ + if (config_default_proto && config_default_proto != IPPROTO_TCP) + return probe_udp_first; + + return probe_tcp_first; +} +#else +static const unsigned int *nfs_default_proto() +{ + return probe_tcp_first; +} +#endif /* MOUNT_CONFIG */ + +/** + * 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 = { @@ -589,7 +621,6 @@ out_ok: nfs_clear_rpc_createerr(); return 1; } - /* * Probe a server's NFS service to determine which versions and * transport protocols are supported. @@ -609,10 +640,14 @@ static int nfs_probe_nfsport(const struct sockaddr *sap, const socklen_t salen, if (pmap->pm_vers && pmap->pm_prot && pmap->pm_port) return 1; - if (nfs_mount_data_version >= 4) + if (nfs_mount_data_version >= 4) { + const unsigned int *probe_proto; + + probe_proto = nfs_default_proto(); + return nfs_probe_port(sap, salen, pmap, - probe_nfs3_first, probe_tcp_first); - else + probe_nfs3_first, probe_proto); + } else return nfs_probe_port(sap, salen, pmap, probe_nfs2_only, probe_udp_only); } @@ -1264,6 +1299,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)) { @@ -1275,17 +1311,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); } /* @@ -1394,20 +1421,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