You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							62 lines
						
					
					
						
							1.7 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							62 lines
						
					
					
						
							1.7 KiB
						
					
					
				| /* | |
|  * Copyright (c) 2006-2021, RT-Thread Development Team | |
|  * | |
|  * SPDX-License-Identifier: Apache-2.0 | |
|  * | |
|  * Change Logs: | |
|  * Date           Author       Notes | |
|  */ | |
| #include "pmap.h" | |
| #include "clnt.h" | |
| #include <rpc/rpc.h> | |
|  | |
| static struct timeval timeout = { 5, 0 }; | |
| static struct timeval tottimeout = { 60, 0 }; | |
| 
 | |
| 
 | |
| bool_t xdr_pmap(XDR *xdrs, struct pmap *regs) | |
| { | |
|     if (xdr_u_long(xdrs, ®s->pm_prog) && | |
|         xdr_u_long(xdrs, ®s->pm_vers) && | |
|         xdr_u_long(xdrs, ®s->pm_prot)) | |
|             return (xdr_u_long(xdrs, ®s->pm_port)); | |
|     return (FALSE); | |
| } | |
| 
 | |
| /* | |
|  * Find the mapped port for program,version. | |
|  * Calls the pmap service remotely to do the lookup. | |
|  * Returns 0 if no map exists. | |
|  */ | |
| unsigned short pmap_getport(struct sockaddr_in *address, unsigned long program, unsigned long version, unsigned int protocol) | |
| { | |
|     unsigned short port = 0; | |
|     int socket = -1; | |
|     register CLIENT *client = RT_NULL; | |
|     struct pmap parms; | |
| 
 | |
|     address->sin_port = htons((unsigned short)PMAPPORT); | |
|     if (protocol == IPPROTO_UDP) | |
|       client = clntudp_bufcreate(address, PMAPPROG, PMAPVERS, timeout, | |
|                                   &socket, RPCSMALLMSGSIZE, | |
|                                RPCSMALLMSGSIZE); | |
| 
 | |
|     if (client != (CLIENT *) NULL) | |
|     { | |
|         parms.pm_prog = program; | |
|         parms.pm_vers = version; | |
|         parms.pm_prot = protocol; | |
|         parms.pm_port = 0;      /* not needed or used */ | |
|         if (CLNT_CALL(client, PMAPPROC_GETPORT, (xdrproc_t)xdr_pmap, (char*)&parms, | |
|                       (xdrproc_t)xdr_u_short, (char*)&port, tottimeout) != RPC_SUCCESS) | |
|         { | |
|             rt_kprintf("pmap failure\n"); | |
|         } | |
|         CLNT_DESTROY(client); | |
|     } | |
| 
 | |
|     (void) lwip_close(socket); | |
|     address->sin_port = 0; | |
| 
 | |
|     return (port); | |
| }
 | |
| 
 |