X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=support%2Fnfs%2Fgetport.c;h=2b80dcea5960a35bc439ad4b97122ba93ef4a67c;hp=2255b7d1bc86f344bd2f51ac175325bdad1468b6;hb=93b7d1f16db674827fc85e70bff1745f57fb6a60;hpb=d271666403a87e60bbdee85372b6dcf35c2975ed diff --git a/support/nfs/getport.c b/support/nfs/getport.c index 2255b7d..2b80dce 100644 --- a/support/nfs/getport.c +++ b/support/nfs/getport.c @@ -41,8 +41,8 @@ #include #ifdef HAVE_LIBTIRPC -#include -#include +#include +#include #endif #include "nfsrpc.h" @@ -60,9 +60,9 @@ #endif /* !HAVE_LIBTIRPC */ #ifdef HAVE_LIBTIRPC -const static rpcvers_t default_rpcb_version = RPCBVERS_4; +static const rpcvers_t default_rpcb_version = RPCBVERS_4; #else /* !HAVE_LIBTIRPC */ -const static rpcvers_t default_rpcb_version = PMAPVERS; +static const rpcvers_t default_rpcb_version = PMAPVERS; #endif /* !HAVE_LIBTIRPC */ #ifdef HAVE_DECL_AI_ADDRCONFIG @@ -201,7 +201,7 @@ static in_port_t nfs_gp_get_rpcb_port(const unsigned short protocol) * client. Otherwise returns NULL, and rpc_createerr.cf_stat is set to * reflect the error. */ -static CLIENT *nfs_gp_get_rpcbclient(const struct sockaddr *sap, +static CLIENT *nfs_gp_get_rpcbclient(struct sockaddr *sap, const socklen_t salen, const unsigned short transport, const rpcvers_t version, @@ -214,14 +214,10 @@ static CLIENT *nfs_gp_get_rpcbclient(const struct sockaddr *sap, "sunrpc", NULL, }; - struct sockaddr_storage address; - struct sockaddr *saddr = (struct sockaddr *)&address; rpcprog_t rpcb_prog = nfs_getrpcbyname(RPCBPROG, rpcb_pgmtbl); - memcpy(saddr, sap, (size_t)salen); - nfs_gp_set_port(saddr, nfs_gp_get_rpcb_port(transport)); - - return nfs_get_rpcclient(saddr, salen, transport, rpcb_prog, + nfs_gp_set_port(sap, nfs_gp_get_rpcb_port(transport)); + return nfs_get_rpcclient(sap, salen, transport, rpcb_prog, version, timeout); } @@ -458,10 +454,6 @@ static int nfs_gp_ping(CLIENT *client, struct timeval timeout) /* * Initialize the rpcb argument for a GETADDR request. * - * The rpcbind daemon ignores the parms.r_owner field in GETADDR - * requests, but we plant an eye-catcher to help distinguish these - * requests in network traces. - * * Returns 1 if successful, and caller must free strings pointed * to by r_netid and r_addr; otherwise 0. */ @@ -489,7 +481,7 @@ static int nfs_gp_init_rpcb_parms(const struct sockaddr *sap, parms->r_vers = version; parms->r_netid = netid; parms->r_addr = addr; - parms->r_owner = "nfs-utils"; /* eye-catcher */ + parms->r_owner = ""; return 1; } @@ -667,7 +659,7 @@ static unsigned short nfs_gp_getport(CLIENT *client, } /** - * nfs_rcp_ping - Determine if RPC service is responding to requests + * nfs_rpc_ping - Determine if RPC service is responding to requests * @sap: pointer to address of server to query (port is already filled in) * @salen: length of server address * @program: requested RPC program number @@ -682,6 +674,8 @@ int nfs_rpc_ping(const struct sockaddr *sap, const socklen_t salen, const rpcprog_t program, const rpcvers_t version, const unsigned short protocol, const struct timeval *timeout) { + struct sockaddr_storage address; + struct sockaddr *saddr = (struct sockaddr *)&address; CLIENT *client; struct timeval tout = { -1, 0 }; int result = 0; @@ -689,7 +683,9 @@ int nfs_rpc_ping(const struct sockaddr *sap, const socklen_t salen, if (timeout != NULL) tout = *timeout; - client = nfs_get_rpcclient(sap, salen, protocol, program, version, &tout); + memcpy(saddr, sap, (size_t)salen); + client = nfs_get_rpcclient(saddr, salen, protocol, + program, version, &tout); if (client != NULL) { result = nfs_gp_ping(client, tout); CLNT_DESTROY(client); @@ -744,14 +740,17 @@ unsigned short nfs_getport(const struct sockaddr *sap, const rpcvers_t version, const unsigned short protocol) { + struct sockaddr_storage address; + struct sockaddr *saddr = (struct sockaddr *)&address; struct timeval timeout = { -1, 0 }; unsigned short port = 0; CLIENT *client; - client = nfs_gp_get_rpcbclient(sap, salen, protocol, + memcpy(saddr, sap, (size_t)salen); + client = nfs_gp_get_rpcbclient(saddr, salen, protocol, default_rpcb_version, &timeout); if (client != NULL) { - port = nfs_gp_getport(client, sap, salen, program, + port = nfs_gp_getport(client, saddr, salen, program, version, protocol, timeout); CLNT_DESTROY(client); } @@ -934,6 +933,8 @@ unsigned short nfs_rpcb_getaddr(const struct sockaddr *sap, const unsigned short protocol, const struct timeval *timeout) { + struct sockaddr_storage address; + struct sockaddr *saddr = (struct sockaddr *)&address; CLIENT *client; struct rpcb parms; struct timeval tout = { -1, 0 }; @@ -942,7 +943,9 @@ unsigned short nfs_rpcb_getaddr(const struct sockaddr *sap, if (timeout != NULL) tout = *timeout; - client = nfs_gp_get_rpcbclient(sap, salen, transport, RPCBVERS_4, &tout); + memcpy(saddr, sap, (size_t)salen); + client = nfs_gp_get_rpcbclient(saddr, salen, transport, + RPCBVERS_4, &tout); if (client != NULL) { if (nfs_gp_init_rpcb_parms(addr, addrlen, program, version, protocol, &parms) != 0) { @@ -1008,6 +1011,8 @@ unsigned long nfs_pmap_getport(const struct sockaddr_in *sin, const unsigned long protocol, const struct timeval *timeout) { + struct sockaddr_in address; + struct sockaddr *saddr = (struct sockaddr *)&address; CLIENT *client; struct pmap parms = { .pm_prog = program, @@ -1020,8 +1025,8 @@ unsigned long nfs_pmap_getport(const struct sockaddr_in *sin, if (timeout != NULL) tout = *timeout; - client = nfs_gp_get_rpcbclient((struct sockaddr *)sin, - (socklen_t)sizeof(*sin), + memcpy(saddr, sin, sizeof(address)); + client = nfs_gp_get_rpcbclient(saddr, (socklen_t)sizeof(*sin), transport, PMAPVERS, &tout); if (client != NULL) { port = nfs_gp_pmap_getport(client, &parms, tout);