1 /* $NetBSD: pmap_getport.c,v 1.18 2008/01/28 01:10:22 christos Exp $ */
4 * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
5 * unrestricted use provided that this legend is included on all tape
6 * media and as a part of the software program in whole or part. Users
7 * may copy or modify Sun RPC without charge, but are not authorized
8 * to license or distribute it to anyone else except as part of a product or
9 * program developed by the user.
11 * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
12 * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
13 * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
15 * Sun RPC is provided with no support and without any obligation on the
16 * part of Sun Microsystems, Inc. to assist in its use, correction,
17 * modification or enhancement.
19 * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
20 * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
21 * OR ANY PART THEREOF.
23 * In no event will Sun Microsystems, Inc. be liable for any lost revenue
24 * or profits or other special, indirect and consequential damages, even if
25 * Sun has been advised of the possibility of such damages.
27 * Sun Microsystems, Inc.
29 * Mountain View, California 94043
32 #include <sys/cdefs.h>
33 #if defined(LIBC_SCCS) && !defined(lint)
35 static char *sccsid
= "@(#)pmap_getport.c 1.9 87/08/11 Copyr 1984 Sun Micro";
36 static char *sccsid
= "@(#)pmap_getport.c 2.2 88/08/01 4.0 RPCSRC";
38 __RCSID("$NetBSD: pmap_getport.c,v 1.18 2008/01/28 01:10:22 christos Exp $");
44 * Client interface to pmap rpc service.
46 * Copyright (C) 1984, Sun Microsystems, Inc.
49 #include "namespace.h"
51 #include <sys/types.h>
52 #include <sys/socket.h>
60 #include <rpc/pmap_prot.h>
61 #include <rpc/pmap_clnt.h>
64 __weak_alias(pmap_getport
,_pmap_getport
)
67 static const struct timeval timeout
= { 5, 0 };
68 static const struct timeval tottimeout
= { 60, 0 };
71 * Find the mapped port for program,version.
72 * Calls the pmap service remotely to do the lookup.
73 * Returns 0 if no map exists.
77 remote_pmap_getport(CLIENT
*client
, struct pmap
*parms
, u_short
*port
)
79 if (CLNT_CALL(client
, (rpcproc_t
)PMAPPROC_GETPORT
, (xdrproc_t
)xdr_pmap
,
80 parms
, (xdrproc_t
)xdr_u_short
, port
, tottimeout
) != RPC_SUCCESS
) {
81 rpc_createerr
.cf_stat
= RPC_PMAPFAILURE
;
82 clnt_geterr(client
, &rpc_createerr
.cf_error
);
83 } else if (*port
== 0) {
84 rpc_createerr
.cf_stat
= RPC_PROGNOTREGISTERED
;
85 clnt_geterr(client
, &rpc_createerr
.cf_error
);
91 get_client(struct sockaddr_in
*address
, int tcp
)
95 return clnttcp_create(address
, PMAPPROG
, PMAPVERS
, &sock
, 0, 0);
97 return clntudp_bufcreate(address
, PMAPPROG
, PMAPVERS
, timeout
,
98 &sock
, RPCSMALLMSGSIZE
, RPCSMALLMSGSIZE
);
102 pmap_getport(struct sockaddr_in
*address
, u_long program
, u_long version
,
109 _DIAGASSERT(address
!= NULL
);
111 parms
.pm_prog
= program
;
112 parms
.pm_vers
= version
;
113 parms
.pm_prot
= protocol
;
114 parms
.pm_port
= 0; /* not needed or used */
116 address
->sin_port
= htons(PMAPPORT
);
118 client
= get_client(address
, protocol
== IPPROTO_TCP
);
120 remote_pmap_getport(client
, &parms
, &port
);
123 client
= get_client(address
, protocol
!= IPPROTO_TCP
);
125 remote_pmap_getport(client
, &parms
, &port
);
128 address
->sin_port
= 0;