X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fmount%2Fnetwork.c;h=9b6504d430b1b0be6dd8ad3672d4707690a44742;hp=d6b5205a18e49438eab45329d60bf654c19da9ac;hb=3ef3dc8f1e87ba7a6eaa3c2a6965aff6c80ba414;hpb=be5b2ed57b0e0a3da91f4ec785718302d0351199 diff --git a/utils/mount/network.c b/utils/mount/network.c index d6b5205..9b6504d 100644 --- a/utils/mount/network.c +++ b/utils/mount/network.c @@ -59,6 +59,8 @@ #define CONNECT_TIMEOUT (20) #define MOUNT_TIMEOUT (30) +#define SAFE_SOCKADDR(x) (struct sockaddr *)(char *)(x) + extern int nfs_mount_data_version; extern char *progname; extern int verbose; @@ -83,6 +85,7 @@ static const char *nfs_nfs_pgmtbl[] = { static const char *nfs_transport_opttbl[] = { "udp", "tcp", + "rdma", "proto", NULL, }; @@ -207,9 +210,6 @@ int nfs_lookup(const char *hostname, const sa_family_t family, { struct addrinfo *gai_results; struct addrinfo gai_hint = { -#ifdef HAVE_DECL_AI_ADDRCONFIG - .ai_flags = AI_ADDRCONFIG, -#endif /* HAVE_DECL_AI_ADDRCONFIG */ .ai_family = family, }; socklen_t len = *salen; @@ -427,12 +427,12 @@ static int get_socket(struct sockaddr_in *saddr, unsigned int p_prot, if (bindresvport(so, &laddr) < 0) goto err_bindresvport; } else { - cc = bind(so, (struct sockaddr *)&laddr, namelen); + cc = bind(so, SAFE_SOCKADDR(&laddr), namelen); if (cc < 0) goto err_bind; } if (type == SOCK_STREAM || (conn && type == SOCK_DGRAM)) { - cc = connect_to(so, (struct sockaddr *)saddr, namelen, + cc = connect_to(so, SAFE_SOCKADDR(saddr), namelen, timeout); if (cc < 0) goto err_connect; @@ -755,11 +755,12 @@ int nfs_probe_bothports(const struct sockaddr *mnt_saddr, */ int probe_bothports(clnt_addr_t *mnt_server, clnt_addr_t *nfs_server) { - return nfs_probe_bothports((struct sockaddr *)&mnt_server->saddr, - sizeof(mnt_server->saddr), + struct sockaddr *mnt_addr = SAFE_SOCKADDR(&mnt_server->saddr); + struct sockaddr *nfs_addr = SAFE_SOCKADDR(&nfs_server->saddr); + + return nfs_probe_bothports(mnt_addr, sizeof(mnt_server->saddr), &mnt_server->pmap, - (struct sockaddr *)&nfs_server->saddr, - sizeof(nfs_server->saddr), + nfs_addr, sizeof(nfs_server->saddr), &nfs_server->pmap); } @@ -771,7 +772,7 @@ static int nfs_probe_statd(void) }; rpcprog_t program = nfs_getrpcbyname(NSMPROG, nfs_ns_pgmtbl); - return nfs_getport_ping((struct sockaddr *)&addr, sizeof(addr), + return nfs_getport_ping(SAFE_SOCKADDR(&addr), sizeof(addr), program, (rpcvers_t)1, IPPROTO_UDP); } @@ -900,7 +901,7 @@ int nfs_advise_umount(const struct sockaddr *sap, const socklen_t salen, */ int nfs_call_umount(clnt_addr_t *mnt_server, dirpath *argp) { - struct sockaddr *sap = (struct sockaddr *)&mnt_server->saddr; + struct sockaddr *sap = SAFE_SOCKADDR(&mnt_server->saddr); socklen_t salen = sizeof(mnt_server->saddr); struct pmap *pmap = &mnt_server->pmap; CLIENT *clnt; @@ -1010,11 +1011,11 @@ int clnt_ping(struct sockaddr_in *saddr, const unsigned long prog, struct sockaddr_in *caddr) { CLIENT *clnt = NULL; - int sock, stat; + int sock, status; static char clnt_res; struct sockaddr dissolve; - rpc_createerr.cf_stat = stat = 0; + rpc_createerr.cf_stat = status = 0; sock = get_socket(saddr, prot, CONNECT_TIMEOUT, FALSE, TRUE); if (sock == RPC_ANYSOCK) { if (rpc_createerr.cf_error.re_errno == ETIMEDOUT) { @@ -1057,18 +1058,18 @@ int clnt_ping(struct sockaddr_in *saddr, const unsigned long prog, return 0; } memset(&clnt_res, 0, sizeof(clnt_res)); - stat = clnt_call(clnt, NULLPROC, + status = clnt_call(clnt, NULLPROC, (xdrproc_t)xdr_void, (caddr_t)NULL, (xdrproc_t)xdr_void, (caddr_t)&clnt_res, TIMEOUT); - if (stat) { + if (status) { clnt_geterr(clnt, &rpc_createerr.cf_error); - rpc_createerr.cf_stat = stat; + rpc_createerr.cf_stat = status; } clnt_destroy(clnt); close(sock); - if (stat == RPC_SUCCESS) + if (status == RPC_SUCCESS) return 1; else return 0; @@ -1102,13 +1103,13 @@ static int nfs_ca_sockname(const struct sockaddr *sap, const socklen_t salen, switch (sap->sa_family) { case AF_INET: - if (bind(sock, (struct sockaddr *)&sin, sizeof(sin)) < 0) { + if (bind(sock, SAFE_SOCKADDR(&sin), sizeof(sin)) < 0) { close(sock); return 0; } break; case AF_INET6: - if (bind(sock, (struct sockaddr *)&sin6, sizeof(sin6)) < 0) { + if (bind(sock, SAFE_SOCKADDR(&sin6), sizeof(sin6)) < 0) { close(sock); return 0; } @@ -1307,7 +1308,10 @@ nfs_nfs_protocol(struct mount_options *options, unsigned long *protocol) case 1: /* tcp */ *protocol = IPPROTO_TCP; return 1; - case 2: /* proto */ + case 2: /* rdma */ + *protocol = NFSPROTO_RDMA; + return 1; + case 3: /* proto */ option = po_get(options, "proto"); if (option != NULL) { if (!nfs_get_proto(option, &family, protocol)) { @@ -1342,7 +1346,7 @@ nfs_nfs_port(struct mount_options *options, unsigned long *port) case PO_NOT_FOUND: break; case PO_FOUND: - if (tmp >= 1 && tmp <= 65535) { + if (tmp >= 0 && tmp <= 65535) { *port = tmp; return 1; } @@ -1396,10 +1400,11 @@ int nfs_nfs_proto_family(struct mount_options *options, switch (po_rightmost(options, nfs_transport_opttbl)) { case 0: /* udp */ case 1: /* tcp */ + case 2: /* rdma */ /* for compatibility; these are always AF_INET */ *family = AF_INET; return 1; - case 2: /* proto */ + case 3: /* proto */ option = po_get(options, "proto"); if (option != NULL && !nfs_get_proto(option, &tmp_family, &protocol)) { @@ -1513,7 +1518,11 @@ nfs_mount_protocol(struct mount_options *options, unsigned long *protocol) * set @protocol to zero. The pmap protocol value will * be filled in later by an rpcbind query in this case. */ - return nfs_nfs_protocol(options, protocol); + if (!nfs_nfs_protocol(options, protocol)) + return 0; + if (*protocol == NFSPROTO_RDMA) + *protocol = IPPROTO_TCP; + return 1; } /* @@ -1529,7 +1538,7 @@ nfs_mount_port(struct mount_options *options, unsigned long *port) case PO_NOT_FOUND: break; case PO_FOUND: - if (tmp >= 1 && tmp <= 65535) { + if (tmp >= 0 && tmp <= 65535) { *port = tmp; return 1; }