- enum clnt_stat status;
- struct pmap parms;
- int ret, sock;
- struct sockaddr_in laddr, saddr;
- struct timeval tout = {0, 0};
- socklen_t len;
- unsigned int send_sz = 0;
- unsigned int recv_sz = 0;
- unsigned short port;
-
- memset(&laddr, 0, sizeof(laddr));
- memset(&saddr, 0, sizeof(saddr));
- memset(&parms, 0, sizeof(parms));
-
- memcpy(&saddr, addr, sizeof(saddr));
- saddr.sin_port = htons(PMAPPORT);
-
- if (prot == IPPROTO_TCP) {
- sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (sock == -1) {
- rpc_createerr.cf_stat = RPC_SYSTEMERROR;
- rpc_createerr.cf_error.re_errno = errno;
- return 0;
- }
-
- tout.tv_sec = TIMEOUT_TCP;
-
- ret = connect_nb(sock, &saddr, &tout);
- if (ret == -1) {
- close(sock);
- rpc_createerr.cf_stat = RPC_SYSTEMERROR;
- rpc_createerr.cf_error.re_errno = errno;
- return 0;
- }
- client = clnttcp_create(&saddr,
- PMAPPROG, PMAPVERS, &sock,
- 0, 0);
- } else {
- /*
- * bind to any unused port. If we left this up to the rpc
- * layer, it would bind to a reserved port, which has been shown
- * to exhaust the reserved port range in some situations.
- */
- sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
- if (sock == -1) {
- rpc_createerr.cf_stat = RPC_SYSTEMERROR;
- rpc_createerr.cf_error.re_errno = errno;
- return 0;
- }
-
- laddr.sin_family = AF_INET;
- laddr.sin_port = 0;
- laddr.sin_addr.s_addr = htonl(INADDR_ANY);