pmap_getport.c revision 1.2
1/*	$OpenBSD: pmap_getport.c,v 1.2 1996/07/20 06:12:32 deraadt Exp $	*/
2/*	$NetBSD: pmap_getport.c,v 1.2 1995/02/25 03:01:49 cgd Exp $	*/
3
4/*
5 * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
6 * unrestricted use provided that this legend is included on all tape
7 * media and as a part of the software program in whole or part.  Users
8 * may copy or modify Sun RPC without charge, but are not authorized
9 * to license or distribute it to anyone else except as part of a product or
10 * program developed by the user.
11 *
12 * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
13 * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
14 * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
15 *
16 * Sun RPC is provided with no support and without any obligation on the
17 * part of Sun Microsystems, Inc. to assist in its use, correction,
18 * modification or enhancement.
19 *
20 * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
21 * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
22 * OR ANY PART THEREOF.
23 *
24 * In no event will Sun Microsystems, Inc. be liable for any lost revenue
25 * or profits or other special, indirect and consequential damages, even if
26 * Sun has been advised of the possibility of such damages.
27 *
28 * Sun Microsystems, Inc.
29 * 2550 Garcia Avenue
30 * Mountain View, California  94043
31 */
32
33#if defined(LIBC_SCCS) && !defined(lint)
34/*static char *sccsid = "from: @(#)pmap_getport.c 1.9 87/08/11 Copyr 1984 Sun Micro";*/
35/*static char *sccsid = "from: @(#)pmap_getport.c	2.2 88/08/01 4.0 RPCSRC";*/
36static char *rcsid = "$OpenBSD: pmap_getport.c,v 1.2 1996/07/20 06:12:32 deraadt Exp $";
37#endif
38
39/*
40 * pmap_getport.c
41 * Client interface to pmap rpc service.
42 *
43 * Copyright (C) 1984, Sun Microsystems, Inc.
44 */
45
46#include <rpc/rpc.h>
47#include <rpc/pmap_prot.h>
48#include <rpc/pmap_clnt.h>
49#include <sys/socket.h>
50#include <net/if.h>
51
52static struct timeval timeout = { 5, 0 };
53static struct timeval tottimeout = { 60, 0 };
54
55/*
56 * Find the mapped port for program,version.
57 * Calls the pmap service remotely to do the lookup.
58 * Returns 0 if no map exists.
59 */
60u_short
61pmap_getport(address, program, version, protocol)
62	struct sockaddr_in *address;
63	u_long program;
64	u_long version;
65	u_int protocol;
66{
67	u_short port = 0;
68	int socket = -1;
69	register CLIENT *client;
70	struct pmap parms;
71
72	address->sin_port = htons(PMAPPORT);
73	client = clntudp_bufcreate(address, PMAPPROG,
74	    PMAPVERS, timeout, &socket, RPCSMALLMSGSIZE, RPCSMALLMSGSIZE);
75	if (client != (CLIENT *)NULL) {
76		parms.pm_prog = program;
77		parms.pm_vers = version;
78		parms.pm_prot = protocol;
79		parms.pm_port = 0;  /* not needed or used */
80		if (CLNT_CALL(client, PMAPPROC_GETPORT, xdr_pmap, &parms,
81		    xdr_u_short, &port, tottimeout) != RPC_SUCCESS){
82			rpc_createerr.cf_stat = RPC_PMAPFAILURE;
83			clnt_geterr(client, &rpc_createerr.cf_error);
84		} else if (port == 0) {
85			rpc_createerr.cf_stat = RPC_PROGNOTREGISTERED;
86		}
87		CLNT_DESTROY(client);
88	}
89	(void)close(socket);
90	address->sin_port = 0;
91	return (port);
92}
93