unsigned long version,
unsigned int proto)
{
+ struct sockaddr_in bind_saddr;
unsigned short port = 0;
int socket;
CLIENT *clnt = NULL;
enum clnt_stat stat;
+
+ bind_saddr = *saddr;
+ bind_saddr.sin_port = htons(PMAPPORT);
- saddr->sin_port = htons(PMAPPORT);
-
- /*
- * Try to get a socket with a non-privileged port.
- * clnt*create() will create one anyway if this
- * fails.
- */
- socket = get_socket(saddr, proto, PMAP_TIMEOUT, FALSE, FALSE);
+ socket = get_socket(&bind_saddr, proto, PMAP_TIMEOUT, FALSE, FALSE);
if (socket == RPC_ANYSOCK) {
- if (proto == IPPROTO_TCP && errno == ETIMEDOUT) {
- /*
- * TCP SYN timed out, so exit now.
- */
+ if (proto == IPPROTO_TCP &&
+ rpc_createerr.cf_error.re_errno == ETIMEDOUT)
rpc_createerr.cf_stat = RPC_TIMEDOUT;
- }
return 0;
}
switch (proto) {
case IPPROTO_UDP:
- clnt = clntudp_bufcreate(saddr,
+ clnt = clntudp_bufcreate(&bind_saddr,
PMAPPROG, PMAPVERS,
RETRY_TIMEOUT, &socket,
RPCSMALLMSGSIZE,
RPCSMALLMSGSIZE);
break;
case IPPROTO_TCP:
- clnt = clnttcp_create(saddr, PMAPPROG, PMAPVERS, &socket,
+ clnt = clnttcp_create(&bind_saddr,
+ PMAPPROG, PMAPVERS,
+ &socket,
RPCSMALLMSGSIZE, RPCSMALLMSGSIZE);
break;
}
inet_ntoa(saddr->sin_addr),
prog, *p_vers,
*p_prot == IPPROTO_UDP ?
- "udp" : "tcp",
+ _("UDP") : _("TCP"),
p_port);
}
if (clnt_ping(saddr, prog, *p_vers, *p_prot, NULL))
static char clnt_res;
struct sockaddr dissolve;
- rpc_createerr.cf_stat = stat = errno = 0;
+ rpc_createerr.cf_stat = stat = 0;
sock = get_socket(saddr, prot, CONNECT_TIMEOUT, FALSE, TRUE);
if (sock == RPC_ANYSOCK) {
- if (errno == ETIMEDOUT) {
+ if (rpc_createerr.cf_error.re_errno == ETIMEDOUT) {
/*
* TCP timeout. Bubble up the error to see
* how it should be handled.