1 /* 2 * Copyright (c) 2006-2018, RT-Thread Development Team 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 * 6 * Change Logs: 7 * Date Author Notes 8 */ 9 #include "pmap.h" 10 #include "clnt.h" 11 #include <rpc/rpc.h> 12 13 static struct timeval timeout = { 5, 0 }; 14 static struct timeval tottimeout = { 60, 0 }; 15 16 17 bool_t xdr_pmap(XDR *xdrs, struct pmap *regs) 18 { 19 if (xdr_u_long(xdrs, ®s->pm_prog) && 20 xdr_u_long(xdrs, ®s->pm_vers) && 21 xdr_u_long(xdrs, ®s->pm_prot)) 22 return (xdr_u_long(xdrs, ®s->pm_port)); 23 return (FALSE); 24 } 25 26 /* 27 * Find the mapped port for program,version. 28 * Calls the pmap service remotely to do the lookup. 29 * Returns 0 if no map exists. 30 */ 31 unsigned short pmap_getport(struct sockaddr_in *address, unsigned long program, unsigned long version, unsigned int protocol) 32 { 33 unsigned short port = 0; 34 int socket = -1; 35 register CLIENT *client = RT_NULL; 36 struct pmap parms; 37 38 address->sin_port = htons((unsigned short)PMAPPORT); 39 if (protocol == IPPROTO_UDP) 40 client = clntudp_bufcreate(address, PMAPPROG, PMAPVERS, timeout, 41 &socket, RPCSMALLMSGSIZE, 42 RPCSMALLMSGSIZE); 43 44 if (client != (CLIENT *) NULL) 45 { 46 parms.pm_prog = program; 47 parms.pm_vers = version; 48 parms.pm_prot = protocol; 49 parms.pm_port = 0; /* not needed or used */ 50 if (CLNT_CALL(client, PMAPPROC_GETPORT, (xdrproc_t)xdr_pmap, (char*)&parms, 51 (xdrproc_t)xdr_u_short, (char*)&port, tottimeout) != RPC_SUCCESS) 52 { 53 rt_kprintf("pmap failure\n"); 54 } 55 CLNT_DESTROY(client); 56 } 57 58 (void) lwip_close(socket); 59 address->sin_port = 0; 60 61 return (port); 62 } 63