1177633Sdfr/*	$NetBSD: clnt.h,v 1.14 2000/06/02 22:57:55 fvdl Exp $	*/
2177633Sdfr
3261046Smav/*-
4261046Smav * Copyright (c) 2010, Oracle America, Inc.
5261046Smav * All rights reserved.
6177633Sdfr *
7261046Smav * Redistribution and use in source and binary forms, with or without
8261046Smav * modification, are permitted provided that the following conditions are met:
9261046Smav * - Redistributions of source code must retain the above copyright notice,
10261046Smav *   this list of conditions and the following disclaimer.
11261046Smav * - Redistributions in binary form must reproduce the above copyright notice,
12261046Smav *   this list of conditions and the following disclaimer in the documentation
13261046Smav *   and/or other materials provided with the distribution.
14261046Smav * - Neither the name of the "Oracle America, Inc." nor the names of its
15261046Smav *   contributors may be used to endorse or promote products derived
16261046Smav *   from this software without specific prior written permission.
17177633Sdfr *
18261046Smav * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19261046Smav * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20261046Smav * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21261046Smav * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22261046Smav * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23261046Smav * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24261046Smav * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25261046Smav * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26261046Smav * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27261046Smav * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28261046Smav * POSSIBILITY OF SUCH DAMAGE.
29177633Sdfr *
30177633Sdfr *	from: @(#)clnt.h 1.31 94/04/29 SMI
31177633Sdfr *	from: @(#)clnt.h	2.1 88/07/29 4.0 RPCSRC
32177633Sdfr * $FreeBSD: releng/10.3/sys/rpc/clnt.h 261046 2014-01-22 23:45:27Z mav $
33177633Sdfr */
34177633Sdfr
35177633Sdfr/*
36177633Sdfr * clnt.h - Client side remote procedure call interface.
37177633Sdfr *
38177633Sdfr * Copyright (c) 1986-1991,1994-1999 by Sun Microsystems, Inc.
39177633Sdfr * All rights reserved.
40177633Sdfr */
41177633Sdfr
42177633Sdfr#ifndef _RPC_CLNT_H_
43177633Sdfr#define _RPC_CLNT_H_
44177633Sdfr#include <rpc/clnt_stat.h>
45177633Sdfr#include <sys/cdefs.h>
46177633Sdfr#ifdef _KERNEL
47180025Sdfr#include <sys/refcount.h>
48177633Sdfr#include <rpc/netconfig.h>
49177633Sdfr#else
50177633Sdfr#include <netconfig.h>
51177633Sdfr#endif
52177633Sdfr#include <sys/un.h>
53177633Sdfr
54177633Sdfr/*
55177633Sdfr * Well-known IPV6 RPC broadcast address.
56177633Sdfr */
57177633Sdfr#define RPCB_MULTICAST_ADDR "ff02::202"
58177633Sdfr
59177633Sdfr/*
60177633Sdfr * the following errors are in general unrecoverable.  The caller
61177633Sdfr * should give up rather than retry.
62177633Sdfr */
63177633Sdfr#define IS_UNRECOVERABLE_RPC(s) (((s) == RPC_AUTHERROR) || \
64177633Sdfr	((s) == RPC_CANTENCODEARGS) || \
65177633Sdfr	((s) == RPC_CANTDECODERES) || \
66177633Sdfr	((s) == RPC_VERSMISMATCH) || \
67177633Sdfr	((s) == RPC_PROCUNAVAIL) || \
68177633Sdfr	((s) == RPC_PROGUNAVAIL) || \
69177633Sdfr	((s) == RPC_PROGVERSMISMATCH) || \
70177633Sdfr	((s) == RPC_CANTDECODEARGS))
71177633Sdfr
72177633Sdfr/*
73177633Sdfr * Error info.
74177633Sdfr */
75177633Sdfrstruct rpc_err {
76177633Sdfr	enum clnt_stat re_status;
77177633Sdfr	union {
78177633Sdfr		int RE_errno;		/* related system error */
79177633Sdfr		enum auth_stat RE_why;	/* why the auth error occurred */
80177633Sdfr		struct {
81177633Sdfr			rpcvers_t low;	/* lowest version supported */
82177633Sdfr			rpcvers_t high;	/* highest version supported */
83177633Sdfr		} RE_vers;
84177633Sdfr		struct {		/* maybe meaningful if RPC_FAILED */
85177633Sdfr			int32_t s1;
86177633Sdfr			int32_t s2;
87177633Sdfr		} RE_lb;		/* life boot & debugging only */
88177633Sdfr	} ru;
89177633Sdfr#define	re_errno	ru.RE_errno
90177633Sdfr#define	re_why		ru.RE_why
91177633Sdfr#define	re_vers		ru.RE_vers
92177633Sdfr#define	re_lb		ru.RE_lb
93177633Sdfr};
94177633Sdfr
95180025Sdfr#ifdef _KERNEL
96180025Sdfr/*
97180025Sdfr * Functions of this type may be used to receive notification when RPC
98180025Sdfr * calls have to be re-transmitted etc.
99180025Sdfr */
100180025Sdfrtypedef void rpc_feedback(int cmd, int procnum, void *);
101177633Sdfr
102177633Sdfr/*
103184588Sdfr * Timers used for the pseudo-transport protocol when using datagrams
104184588Sdfr */
105184588Sdfrstruct rpc_timers {
106184588Sdfr	u_short		rt_srtt;	/* smoothed round-trip time */
107184588Sdfr	u_short		rt_deviate;	/* estimated deviation */
108184588Sdfr	u_long		rt_rtxcur;	/* current (backed-off) rto */
109184588Sdfr};
110184588Sdfr
111184588Sdfr/*
112180025Sdfr * A structure used with CLNT_CALL_EXT to pass extra information used
113180025Sdfr * while processing an RPC call.
114180025Sdfr */
115180025Sdfrstruct rpc_callextra {
116180025Sdfr	AUTH		*rc_auth;	/* auth handle to use for this call */
117180025Sdfr	rpc_feedback	*rc_feedback;	/* callback for retransmits etc. */
118180025Sdfr	void		*rc_feedback_arg; /* argument for callback */
119184588Sdfr	struct rpc_timers *rc_timers;	  /* optional RTT timers */
120184588Sdfr	struct rpc_err	rc_err;		/* detailed call status */
121180025Sdfr};
122180025Sdfr#endif
123180025Sdfr
124180025Sdfr/*
125177633Sdfr * Client rpc handle.
126177633Sdfr * Created by individual implementations
127177633Sdfr * Client is responsible for initializing auth, see e.g. auth_none.c.
128177633Sdfr */
129177633Sdfrtypedef struct __rpc_client {
130180025Sdfr#ifdef _KERNEL
131180025Sdfr	volatile u_int cl_refs;			/* reference count */
132177633Sdfr	AUTH	*cl_auth;			/* authenticator */
133177633Sdfr	struct clnt_ops {
134177633Sdfr		/* call remote procedure */
135177633Sdfr		enum clnt_stat	(*cl_call)(struct __rpc_client *,
136184588Sdfr		    struct rpc_callextra *, rpcproc_t,
137184588Sdfr		    struct mbuf *, struct mbuf **, struct timeval);
138177633Sdfr		/* abort a call */
139177633Sdfr		void		(*cl_abort)(struct __rpc_client *);
140177633Sdfr		/* get specific error code */
141177633Sdfr		void		(*cl_geterr)(struct __rpc_client *,
142177633Sdfr					struct rpc_err *);
143177633Sdfr		/* frees results */
144177633Sdfr		bool_t		(*cl_freeres)(struct __rpc_client *,
145177633Sdfr					xdrproc_t, void *);
146184588Sdfr		/* close the connection and terminate pending RPCs */
147184588Sdfr		void		(*cl_close)(struct __rpc_client *);
148177633Sdfr		/* destroy this structure */
149177633Sdfr		void		(*cl_destroy)(struct __rpc_client *);
150177633Sdfr		/* the ioctl() of rpc */
151177633Sdfr		bool_t          (*cl_control)(struct __rpc_client *, u_int,
152177633Sdfr				    void *);
153177633Sdfr	} *cl_ops;
154180025Sdfr#else
155180025Sdfr	AUTH	*cl_auth;			/* authenticator */
156180025Sdfr	struct clnt_ops {
157180025Sdfr		/* call remote procedure */
158180025Sdfr		enum clnt_stat	(*cl_call)(struct __rpc_client *,
159180025Sdfr		    rpcproc_t, xdrproc_t, void *, xdrproc_t,
160180025Sdfr		    void *, struct timeval);
161180025Sdfr		/* abort a call */
162180025Sdfr		void		(*cl_abort)(struct __rpc_client *);
163180025Sdfr		/* get specific error code */
164180025Sdfr		void		(*cl_geterr)(struct __rpc_client *,
165180025Sdfr					struct rpc_err *);
166180025Sdfr		/* frees results */
167180025Sdfr		bool_t		(*cl_freeres)(struct __rpc_client *,
168180025Sdfr					xdrproc_t, void *);
169180025Sdfr		/* destroy this structure */
170180025Sdfr		void		(*cl_destroy)(struct __rpc_client *);
171180025Sdfr		/* the ioctl() of rpc */
172180025Sdfr		bool_t          (*cl_control)(struct __rpc_client *, u_int,
173180025Sdfr				    void *);
174180025Sdfr	} *cl_ops;
175180025Sdfr#endif
176177633Sdfr	void 			*cl_private;	/* private stuff */
177177633Sdfr	char			*cl_netid;	/* network token */
178177633Sdfr	char			*cl_tp;		/* device name */
179177633Sdfr} CLIENT;
180177633Sdfr
181177633Sdfr/*
182177633Sdfr * Feedback values used for possible congestion and rate control
183177633Sdfr */
184180025Sdfr#define FEEDBACK_OK		1	/* no retransmits */
185180025Sdfr#define FEEDBACK_REXMIT1	2	/* first retransmit */
186180025Sdfr#define FEEDBACK_REXMIT2	3	/* second and subsequent retransmit */
187180025Sdfr#define FEEDBACK_RECONNECT	4	/* client reconnect */
188177633Sdfr
189177633Sdfr/* Used to set version of portmapper used in broadcast */
190177633Sdfr
191177633Sdfr#define CLCR_SET_LOWVERS	3
192177633Sdfr#define CLCR_GET_LOWVERS	4
193177633Sdfr
194177633Sdfr#define RPCSMALLMSGSIZE 400	/* a more reasonable packet size */
195177633Sdfr
196177633Sdfr/*
197177633Sdfr * client side rpc interface ops
198177633Sdfr *
199177633Sdfr * Parameter types are:
200177633Sdfr *
201177633Sdfr */
202177633Sdfr
203180025Sdfr#ifdef _KERNEL
204180025Sdfr#define CLNT_ACQUIRE(rh)			\
205180025Sdfr	refcount_acquire(&(rh)->cl_refs)
206180025Sdfr#define CLNT_RELEASE(rh)			\
207180025Sdfr	if (refcount_release(&(rh)->cl_refs))	\
208180025Sdfr		CLNT_DESTROY(rh)
209180025Sdfr
210177633Sdfr/*
211184588Sdfr * void
212184588Sdfr * CLNT_CLOSE(rh);
213184588Sdfr * 	CLIENT *rh;
214184588Sdfr */
215184588Sdfr#define	CLNT_CLOSE(rh)	((*(rh)->cl_ops->cl_close)(rh))
216184588Sdfr
217184588Sdfrenum clnt_stat clnt_call_private(CLIENT *, struct rpc_callextra *, rpcproc_t,
218184588Sdfr    xdrproc_t, void *, xdrproc_t, void *, struct timeval);
219184588Sdfr
220184588Sdfr/*
221177633Sdfr * enum clnt_stat
222184588Sdfr * CLNT_CALL_MBUF(rh, ext, proc, mreq, mrepp, timeout)
223184588Sdfr * 	CLIENT *rh;
224184588Sdfr *	struct rpc_callextra *ext;
225184588Sdfr *	rpcproc_t proc;
226184588Sdfr *	struct mbuf *mreq;
227184588Sdfr *	struct mbuf **mrepp;
228184588Sdfr *	struct timeval timeout;
229184588Sdfr *
230184588Sdfr * Call arguments in mreq which is consumed by the call (even if there
231184588Sdfr * is an error). Results returned in *mrepp.
232184588Sdfr */
233184588Sdfr#define	CLNT_CALL_MBUF(rh, ext, proc, mreq, mrepp, secs)	\
234184588Sdfr	((*(rh)->cl_ops->cl_call)(rh, ext, proc, mreq, mrepp, secs))
235184588Sdfr
236184588Sdfr/*
237184588Sdfr * enum clnt_stat
238180025Sdfr * CLNT_CALL_EXT(rh, ext, proc, xargs, argsp, xres, resp, timeout)
239180025Sdfr * 	CLIENT *rh;
240180025Sdfr *	struct rpc_callextra *ext;
241180025Sdfr *	rpcproc_t proc;
242180025Sdfr *	xdrproc_t xargs;
243180025Sdfr *	void *argsp;
244180025Sdfr *	xdrproc_t xres;
245180025Sdfr *	void *resp;
246180025Sdfr *	struct timeval timeout;
247180025Sdfr */
248180025Sdfr#define	CLNT_CALL_EXT(rh, ext, proc, xargs, argsp, xres, resp, secs)	\
249184588Sdfr	clnt_call_private(rh, ext, proc, xargs,				\
250184588Sdfr		argsp, xres, resp, secs)
251180025Sdfr#endif
252180025Sdfr
253180025Sdfr/*
254180025Sdfr * enum clnt_stat
255177633Sdfr * CLNT_CALL(rh, proc, xargs, argsp, xres, resp, timeout)
256177633Sdfr * 	CLIENT *rh;
257177633Sdfr *	rpcproc_t proc;
258177633Sdfr *	xdrproc_t xargs;
259177633Sdfr *	void *argsp;
260177633Sdfr *	xdrproc_t xres;
261177633Sdfr *	void *resp;
262177633Sdfr *	struct timeval timeout;
263177633Sdfr */
264180025Sdfr#ifdef _KERNEL
265184588Sdfr#define	CLNT_CALL(rh, proc, xargs, argsp, xres, resp, secs)	\
266184588Sdfr	clnt_call_private(rh, NULL, proc, xargs,		\
267184588Sdfr		argsp, xres, resp, secs)
268184588Sdfr#define	clnt_call(rh, proc, xargs, argsp, xres, resp, secs)	\
269184588Sdfr	clnt_call_private(rh, NULL, proc, xargs,		\
270184588Sdfr		argsp, xres, resp, secs)
271180025Sdfr#else
272180025Sdfr#define	CLNT_CALL(rh, proc, xargs, argsp, xres, resp, secs)		\
273180025Sdfr	((*(rh)->cl_ops->cl_call)(rh, proc, xargs,	\
274180025Sdfr		argsp, xres, resp, secs))
275180025Sdfr#define	clnt_call(rh, proc, xargs, argsp, xres, resp, secs)		\
276180025Sdfr	((*(rh)->cl_ops->cl_call)(rh, proc, xargs,	\
277180025Sdfr		argsp, xres, resp, secs))
278180025Sdfr#endif
279177633Sdfr
280177633Sdfr/*
281177633Sdfr * void
282177633Sdfr * CLNT_ABORT(rh);
283177633Sdfr * 	CLIENT *rh;
284177633Sdfr */
285177633Sdfr#define	CLNT_ABORT(rh)	((*(rh)->cl_ops->cl_abort)(rh))
286177633Sdfr#define	clnt_abort(rh)	((*(rh)->cl_ops->cl_abort)(rh))
287177633Sdfr
288177633Sdfr/*
289177633Sdfr * struct rpc_err
290177633Sdfr * CLNT_GETERR(rh);
291177633Sdfr * 	CLIENT *rh;
292177633Sdfr */
293177633Sdfr#define	CLNT_GETERR(rh,errp)	((*(rh)->cl_ops->cl_geterr)(rh, errp))
294177633Sdfr#define	clnt_geterr(rh,errp)	((*(rh)->cl_ops->cl_geterr)(rh, errp))
295177633Sdfr
296177633Sdfr
297177633Sdfr/*
298177633Sdfr * bool_t
299177633Sdfr * CLNT_FREERES(rh, xres, resp);
300177633Sdfr * 	CLIENT *rh;
301177633Sdfr *	xdrproc_t xres;
302177633Sdfr *	void *resp;
303177633Sdfr */
304177633Sdfr#define	CLNT_FREERES(rh,xres,resp) ((*(rh)->cl_ops->cl_freeres)(rh,xres,resp))
305177633Sdfr#define	clnt_freeres(rh,xres,resp) ((*(rh)->cl_ops->cl_freeres)(rh,xres,resp))
306177633Sdfr
307177633Sdfr/*
308177633Sdfr * bool_t
309177633Sdfr * CLNT_CONTROL(cl, request, info)
310177633Sdfr *      CLIENT *cl;
311177633Sdfr *      u_int request;
312177633Sdfr *      char *info;
313177633Sdfr */
314177633Sdfr#define	CLNT_CONTROL(cl,rq,in) ((*(cl)->cl_ops->cl_control)(cl,rq,in))
315177633Sdfr#define	clnt_control(cl,rq,in) ((*(cl)->cl_ops->cl_control)(cl,rq,in))
316177633Sdfr
317177633Sdfr/*
318177633Sdfr * control operations that apply to both udp and tcp transports
319177633Sdfr */
320177633Sdfr#define CLSET_TIMEOUT		1	/* set timeout (timeval) */
321177633Sdfr#define CLGET_TIMEOUT		2	/* get timeout (timeval) */
322177633Sdfr#define CLGET_SERVER_ADDR	3	/* get server's address (sockaddr) */
323177633Sdfr#define CLGET_FD		6	/* get connections file descriptor */
324177633Sdfr#define CLGET_SVC_ADDR		7	/* get server's address (netbuf) */
325177633Sdfr#define CLSET_FD_CLOSE		8	/* close fd while clnt_destroy */
326177633Sdfr#define CLSET_FD_NCLOSE		9	/* Do not close fd while clnt_destroy */
327177633Sdfr#define CLGET_XID 		10	/* Get xid */
328177633Sdfr#define CLSET_XID		11	/* Set xid */
329177633Sdfr#define CLGET_VERS		12	/* Get version number */
330177633Sdfr#define CLSET_VERS		13	/* Set version number */
331177633Sdfr#define CLGET_PROG		14	/* Get program number */
332177633Sdfr#define CLSET_PROG		15	/* Set program number */
333177633Sdfr#define CLSET_SVC_ADDR		16	/* get server's address (netbuf) */
334177633Sdfr#define CLSET_PUSH_TIMOD	17	/* push timod if not already present */
335177633Sdfr#define CLSET_POP_TIMOD		18	/* pop timod */
336177633Sdfr/*
337177633Sdfr * Connectionless only control operations
338177633Sdfr */
339177633Sdfr#define CLSET_RETRY_TIMEOUT 4   /* set retry timeout (timeval) */
340177633Sdfr#define CLGET_RETRY_TIMEOUT 5   /* get retry timeout (timeval) */
341177633Sdfr#define CLSET_ASYNC		19
342177633Sdfr#define CLSET_CONNECT		20	/* Use connect() for UDP. (int) */
343177633Sdfr
344177633Sdfr#ifdef _KERNEL
345177633Sdfr/*
346177633Sdfr * Kernel control operations. The default msleep string is "rpcrecv",
347177633Sdfr * and sleeps are non-interruptible by default.
348177633Sdfr */
349177633Sdfr#define CLSET_WAITCHAN		21	/* set string to use in msleep call */
350177633Sdfr#define CLGET_WAITCHAN		22	/* get string used in msleep call */
351177633Sdfr#define CLSET_INTERRUPTIBLE	23	/* set interruptible flag */
352177633Sdfr#define CLGET_INTERRUPTIBLE	24	/* set interruptible flag */
353180025Sdfr#define CLSET_RETRIES		25	/* set retry count for reconnect */
354180025Sdfr#define CLGET_RETRIES		26	/* get retry count for reconnect */
355184588Sdfr#define CLSET_PRIVPORT		27	/* set privileged source port flag */
356184588Sdfr#define CLGET_PRIVPORT		28	/* get privileged source port flag */
357244008Srmacklem#define CLSET_BACKCHANNEL	29	/* set backchannel for socket */
358177633Sdfr#endif
359177633Sdfr
360177633Sdfr
361177633Sdfr/*
362177633Sdfr * void
363177633Sdfr * CLNT_DESTROY(rh);
364177633Sdfr * 	CLIENT *rh;
365177633Sdfr */
366177633Sdfr#define	CLNT_DESTROY(rh)	((*(rh)->cl_ops->cl_destroy)(rh))
367177633Sdfr#define	clnt_destroy(rh)	((*(rh)->cl_ops->cl_destroy)(rh))
368177633Sdfr
369177633Sdfr
370177633Sdfr/*
371177633Sdfr * RPCTEST is a test program which is accessible on every rpc
372177633Sdfr * transport/port.  It is used for testing, performance evaluation,
373177633Sdfr * and network administration.
374177633Sdfr */
375177633Sdfr
376177633Sdfr#define RPCTEST_PROGRAM		((rpcprog_t)1)
377177633Sdfr#define RPCTEST_VERSION		((rpcvers_t)1)
378177633Sdfr#define RPCTEST_NULL_PROC	((rpcproc_t)2)
379177633Sdfr#define RPCTEST_NULL_BATCH_PROC	((rpcproc_t)3)
380177633Sdfr
381177633Sdfr/*
382177633Sdfr * By convention, procedure 0 takes null arguments and returns them
383177633Sdfr */
384177633Sdfr
385177633Sdfr#define NULLPROC ((rpcproc_t)0)
386177633Sdfr
387177633Sdfr/*
388177633Sdfr * Below are the client handle creation routines for the various
389177633Sdfr * implementations of client side rpc.  They can return NULL if a
390177633Sdfr * creation failure occurs.
391177633Sdfr */
392177633Sdfr
393177633Sdfr/*
394177633Sdfr * Generic client creation routine. Supported protocols are those that
395177633Sdfr * belong to the nettype namespace (/etc/netconfig).
396177633Sdfr */
397177633Sdfr__BEGIN_DECLS
398177633Sdfr#ifdef _KERNEL
399177633Sdfr
400177633Sdfr/*
401177633Sdfr *	struct socket *so;			-- socket
402177633Sdfr *	struct sockaddr *svcaddr;		-- servers address
403177633Sdfr *	rpcprog_t prog;				-- program number
404177633Sdfr *	rpcvers_t vers;				-- version number
405177633Sdfr *	size_t sendsz;				-- buffer recv size
406177633Sdfr *	size_t recvsz;				-- buffer send size
407177633Sdfr */
408177633Sdfrextern CLIENT *clnt_dg_create(struct socket *so,
409177633Sdfr    struct sockaddr *svcaddr, rpcprog_t program, rpcvers_t version,
410177633Sdfr    size_t sendsz, size_t recvsz);
411177633Sdfr
412177633Sdfr/*
413177633Sdfr *	struct socket *so;			-- socket
414177633Sdfr *	struct sockaddr *svcaddr;		-- servers address
415177633Sdfr *	rpcprog_t prog;				-- program number
416177633Sdfr *	rpcvers_t vers;				-- version number
417177633Sdfr *	size_t sendsz;				-- buffer recv size
418177633Sdfr *	size_t recvsz;				-- buffer send size
419221127Srmacklem *	int intrflag;				-- is it interruptible
420177633Sdfr */
421177633Sdfrextern CLIENT *clnt_vc_create(struct socket *so,
422177633Sdfr    struct sockaddr *svcaddr, rpcprog_t program, rpcvers_t version,
423221127Srmacklem    size_t sendsz, size_t recvsz, int intrflag);
424177633Sdfr
425177633Sdfr/*
426177633Sdfr *	struct netconfig *nconf;		-- network type
427177633Sdfr *	struct sockaddr *svcaddr;		-- servers address
428177633Sdfr *	rpcprog_t prog;				-- program number
429177633Sdfr *	rpcvers_t vers;				-- version number
430177633Sdfr *	size_t sendsz;				-- buffer recv size
431177633Sdfr *	size_t recvsz;				-- buffer send size
432177633Sdfr */
433177633Sdfrextern CLIENT *clnt_reconnect_create(struct netconfig *nconf,
434177633Sdfr    struct sockaddr *svcaddr, rpcprog_t program, rpcvers_t version,
435177633Sdfr    size_t sendsz, size_t recvsz);
436177633Sdfr
437177633Sdfr#else
438177633Sdfr
439177633Sdfrextern CLIENT *clnt_create(const char *, const rpcprog_t, const rpcvers_t,
440177633Sdfr			   const char *);
441177633Sdfr/*
442177633Sdfr *
443177633Sdfr * 	const char *hostname;			-- hostname
444177633Sdfr *	const rpcprog_t prog;			-- program number
445177633Sdfr *	const rpcvers_t vers;			-- version number
446177633Sdfr *	const char *nettype;			-- network type
447177633Sdfr */
448177633Sdfr
449177633Sdfr /*
450177633Sdfr * Generic client creation routine. Just like clnt_create(), except
451177633Sdfr * it takes an additional timeout parameter.
452177633Sdfr */
453177633Sdfrextern CLIENT * clnt_create_timed(const char *, const rpcprog_t,
454177633Sdfr	const rpcvers_t, const char *, const struct timeval *);
455177633Sdfr/*
456177633Sdfr *
457177633Sdfr *	const char *hostname;			-- hostname
458177633Sdfr *	const rpcprog_t prog;			-- program number
459177633Sdfr *	const rpcvers_t vers;			-- version number
460177633Sdfr *	const char *nettype;			-- network type
461177633Sdfr *	const struct timeval *tp;		-- timeout
462177633Sdfr */
463177633Sdfr
464177633Sdfr/*
465177633Sdfr * Generic client creation routine. Supported protocols are which belong
466177633Sdfr * to the nettype name space.
467177633Sdfr */
468177633Sdfrextern CLIENT *clnt_create_vers(const char *, const rpcprog_t, rpcvers_t *,
469177633Sdfr				const rpcvers_t, const rpcvers_t,
470177633Sdfr				const char *);
471177633Sdfr/*
472177633Sdfr *	const char *host;		-- hostname
473177633Sdfr *	const rpcprog_t prog;		-- program number
474177633Sdfr *	rpcvers_t *vers_out;		-- servers highest available version
475177633Sdfr *	const rpcvers_t vers_low;	-- low version number
476177633Sdfr *	const rpcvers_t vers_high;	-- high version number
477177633Sdfr *	const char *nettype;		-- network type
478177633Sdfr */
479177633Sdfr
480177633Sdfr/*
481177633Sdfr * Generic client creation routine. Supported protocols are which belong
482177633Sdfr * to the nettype name space.
483177633Sdfr */
484177633Sdfrextern CLIENT * clnt_create_vers_timed(const char *, const rpcprog_t,
485177633Sdfr	rpcvers_t *, const rpcvers_t, const rpcvers_t, const char *,
486177633Sdfr	const struct timeval *);
487177633Sdfr/*
488177633Sdfr *	const char *host;		-- hostname
489177633Sdfr *	const rpcprog_t prog;		-- program number
490177633Sdfr *	rpcvers_t *vers_out;		-- servers highest available version
491177633Sdfr *	const rpcvers_t vers_low;	-- low version number
492177633Sdfr *	const rpcvers_t vers_high;	-- high version number
493177633Sdfr *	const char *nettype;		-- network type
494177633Sdfr *	const struct timeval *tp	-- timeout
495177633Sdfr */
496177633Sdfr
497177633Sdfr/*
498177633Sdfr * Generic client creation routine. It takes a netconfig structure
499177633Sdfr * instead of nettype
500177633Sdfr */
501177633Sdfrextern CLIENT *clnt_tp_create(const char *, const rpcprog_t,
502177633Sdfr			      const rpcvers_t, const struct netconfig *);
503177633Sdfr/*
504177633Sdfr *	const char *hostname;			-- hostname
505177633Sdfr *	const rpcprog_t prog;			-- program number
506177633Sdfr *	const rpcvers_t vers;			-- version number
507177633Sdfr *	const struct netconfig *netconf; 	-- network config structure
508177633Sdfr */
509177633Sdfr
510177633Sdfr/*
511177633Sdfr * Generic client creation routine. Just like clnt_tp_create(), except
512177633Sdfr * it takes an additional timeout parameter.
513177633Sdfr */
514177633Sdfrextern CLIENT * clnt_tp_create_timed(const char *, const rpcprog_t,
515177633Sdfr	const rpcvers_t, const struct netconfig *, const struct timeval *);
516177633Sdfr/*
517177633Sdfr *	const char *hostname;			-- hostname
518177633Sdfr *	const rpcprog_t prog;			-- program number
519177633Sdfr *	const rpcvers_t vers;			-- version number
520177633Sdfr *	const struct netconfig *netconf; 	-- network config structure
521177633Sdfr *	const struct timeval *tp		-- timeout
522177633Sdfr */
523177633Sdfr
524177633Sdfr/*
525177633Sdfr * Generic TLI create routine. Only provided for compatibility.
526177633Sdfr */
527177633Sdfr
528177633Sdfrextern CLIENT *clnt_tli_create(const int, const struct netconfig *,
529177633Sdfr			       struct netbuf *, const rpcprog_t,
530177633Sdfr			       const rpcvers_t, const u_int, const u_int);
531177633Sdfr/*
532177633Sdfr *	const register int fd;		-- fd
533177633Sdfr *	const struct netconfig *nconf;	-- netconfig structure
534177633Sdfr *	struct netbuf *svcaddr;		-- servers address
535177633Sdfr *	const u_long prog;			-- program number
536177633Sdfr *	const u_long vers;			-- version number
537177633Sdfr *	const u_int sendsz;			-- send size
538177633Sdfr *	const u_int recvsz;			-- recv size
539177633Sdfr */
540177633Sdfr
541177633Sdfr/*
542177633Sdfr * Low level clnt create routine for connectionful transports, e.g. tcp.
543177633Sdfr */
544177633Sdfrextern CLIENT *clnt_vc_create(const int, const struct netbuf *,
545177633Sdfr			      const rpcprog_t, const rpcvers_t,
546177633Sdfr			      u_int, u_int);
547177633Sdfr/*
548177633Sdfr * Added for compatibility to old rpc 4.0. Obsoleted by clnt_vc_create().
549177633Sdfr */
550177633Sdfrextern CLIENT *clntunix_create(struct sockaddr_un *,
551177633Sdfr			       u_long, u_long, int *, u_int, u_int);
552177633Sdfr/*
553177633Sdfr *	const int fd;				-- open file descriptor
554177633Sdfr *	const struct netbuf *svcaddr;		-- servers address
555177633Sdfr *	const rpcprog_t prog;			-- program number
556177633Sdfr *	const rpcvers_t vers;			-- version number
557177633Sdfr *	const u_int sendsz;			-- buffer recv size
558177633Sdfr *	const u_int recvsz;			-- buffer send size
559177633Sdfr */
560177633Sdfr
561177633Sdfr/*
562177633Sdfr * Low level clnt create routine for connectionless transports, e.g. udp.
563177633Sdfr */
564177633Sdfrextern CLIENT *clnt_dg_create(const int, const struct netbuf *,
565177633Sdfr			      const rpcprog_t, const rpcvers_t,
566177633Sdfr			      const u_int, const u_int);
567177633Sdfr/*
568177633Sdfr *	const int fd;				-- open file descriptor
569177633Sdfr *	const struct netbuf *svcaddr;		-- servers address
570177633Sdfr *	const rpcprog_t program;		-- program number
571177633Sdfr *	const rpcvers_t version;		-- version number
572177633Sdfr *	const u_int sendsz;			-- buffer recv size
573177633Sdfr *	const u_int recvsz;			-- buffer send size
574177633Sdfr */
575177633Sdfr
576177633Sdfr/*
577177633Sdfr * Memory based rpc (for speed check and testing)
578177633Sdfr * CLIENT *
579177633Sdfr * clnt_raw_create(prog, vers)
580177633Sdfr *	u_long prog;
581177633Sdfr *	u_long vers;
582177633Sdfr */
583177633Sdfrextern CLIENT *clnt_raw_create(rpcprog_t, rpcvers_t);
584177633Sdfr#endif
585177633Sdfr
586177633Sdfr__END_DECLS
587177633Sdfr
588177633Sdfr
589177633Sdfr/*
590177633Sdfr * Print why creation failed
591177633Sdfr */
592177633Sdfr__BEGIN_DECLS
593177633Sdfrextern void clnt_pcreateerror(const char *);			/* stderr */
594177633Sdfrextern char *clnt_spcreateerror(const char *);			/* string */
595177633Sdfr__END_DECLS
596177633Sdfr
597177633Sdfr/*
598177633Sdfr * Like clnt_perror(), but is more verbose in its output
599177633Sdfr */
600177633Sdfr__BEGIN_DECLS
601177633Sdfrextern void clnt_perrno(enum clnt_stat);		/* stderr */
602177633Sdfrextern char *clnt_sperrno(enum clnt_stat);		/* string */
603177633Sdfr__END_DECLS
604177633Sdfr
605177633Sdfr/*
606177633Sdfr * Print an English error message, given the client error code
607177633Sdfr */
608177633Sdfr__BEGIN_DECLS
609177633Sdfrextern void clnt_perror(CLIENT *, const char *);	 	/* stderr */
610177633Sdfrextern char *clnt_sperror(CLIENT *, const char *);		/* string */
611177633Sdfr__END_DECLS
612177633Sdfr
613177633Sdfr
614177633Sdfr/*
615177633Sdfr * If a creation fails, the following allows the user to figure out why.
616177633Sdfr */
617177633Sdfrstruct rpc_createerr {
618177633Sdfr	enum clnt_stat cf_stat;
619177633Sdfr	struct rpc_err cf_error; /* useful when cf_stat == RPC_PMAPFAILURE */
620177633Sdfr};
621177633Sdfr
622177633Sdfr#ifdef _KERNEL
623177633Sdfrextern struct rpc_createerr rpc_createerr;
624177633Sdfr#else
625177633Sdfr__BEGIN_DECLS
626177633Sdfrextern struct rpc_createerr	*__rpc_createerr(void);
627177633Sdfr__END_DECLS
628177633Sdfr#define rpc_createerr		(*(__rpc_createerr()))
629177633Sdfr#endif
630177633Sdfr
631180025Sdfr#ifndef _KERNEL
632177633Sdfr/*
633177633Sdfr * The simplified interface:
634177633Sdfr * enum clnt_stat
635177633Sdfr * rpc_call(host, prognum, versnum, procnum, inproc, in, outproc, out, nettype)
636177633Sdfr *	const char *host;
637177633Sdfr *	const rpcprog_t prognum;
638177633Sdfr *	const rpcvers_t versnum;
639177633Sdfr *	const rpcproc_t procnum;
640177633Sdfr *	const xdrproc_t inproc, outproc;
641177633Sdfr *	const char *in;
642177633Sdfr *	char *out;
643177633Sdfr *	const char *nettype;
644177633Sdfr */
645177633Sdfr__BEGIN_DECLS
646177633Sdfrextern enum clnt_stat rpc_call(const char *, const rpcprog_t,
647177633Sdfr			       const rpcvers_t, const rpcproc_t,
648177633Sdfr			       const xdrproc_t, const char *,
649177633Sdfr			       const xdrproc_t, char *, const char *);
650177633Sdfr__END_DECLS
651177633Sdfr
652177633Sdfr/*
653177633Sdfr * RPC broadcast interface
654177633Sdfr * The call is broadcasted to all locally connected nets.
655177633Sdfr *
656177633Sdfr * extern enum clnt_stat
657177633Sdfr * rpc_broadcast(prog, vers, proc, xargs, argsp, xresults, resultsp,
658177633Sdfr *			eachresult, nettype)
659177633Sdfr *	const rpcprog_t		prog;		-- program number
660177633Sdfr *	const rpcvers_t		vers;		-- version number
661177633Sdfr *	const rpcproc_t		proc;		-- procedure number
662177633Sdfr *	const xdrproc_t	xargs;		-- xdr routine for args
663177633Sdfr *	caddr_t		argsp;		-- pointer to args
664177633Sdfr *	const xdrproc_t	xresults;	-- xdr routine for results
665177633Sdfr *	caddr_t		resultsp;	-- pointer to results
666177633Sdfr *	const resultproc_t	eachresult;	-- call with each result
667177633Sdfr *	const char		*nettype;	-- Transport type
668177633Sdfr *
669177633Sdfr * For each valid response received, the procedure eachresult is called.
670177633Sdfr * Its form is:
671177633Sdfr *		done = eachresult(resp, raddr, nconf)
672177633Sdfr *			bool_t done;
673177633Sdfr *			caddr_t resp;
674177633Sdfr *			struct netbuf *raddr;
675177633Sdfr *			struct netconfig *nconf;
676177633Sdfr * where resp points to the results of the call and raddr is the
677177633Sdfr * address if the responder to the broadcast.  nconf is the transport
678177633Sdfr * on which the response was received.
679177633Sdfr *
680177633Sdfr * extern enum clnt_stat
681177633Sdfr * rpc_broadcast_exp(prog, vers, proc, xargs, argsp, xresults, resultsp,
682177633Sdfr *			eachresult, inittime, waittime, nettype)
683177633Sdfr *	const rpcprog_t		prog;		-- program number
684177633Sdfr *	const rpcvers_t		vers;		-- version number
685177633Sdfr *	const rpcproc_t		proc;		-- procedure number
686177633Sdfr *	const xdrproc_t	xargs;		-- xdr routine for args
687177633Sdfr *	caddr_t		argsp;		-- pointer to args
688177633Sdfr *	const xdrproc_t	xresults;	-- xdr routine for results
689177633Sdfr *	caddr_t		resultsp;	-- pointer to results
690177633Sdfr *	const resultproc_t	eachresult;	-- call with each result
691177633Sdfr *	const int 		inittime;	-- how long to wait initially
692177633Sdfr *	const int 		waittime;	-- maximum time to wait
693177633Sdfr *	const char		*nettype;	-- Transport type
694177633Sdfr */
695177633Sdfr
696177633Sdfrtypedef bool_t (*resultproc_t)(caddr_t, ...);
697177633Sdfr
698177633Sdfr__BEGIN_DECLS
699177633Sdfrextern enum clnt_stat rpc_broadcast(const rpcprog_t, const rpcvers_t,
700177633Sdfr				    const rpcproc_t, const xdrproc_t,
701177633Sdfr				    caddr_t, const xdrproc_t, caddr_t,
702177633Sdfr				    const resultproc_t, const char *);
703177633Sdfrextern enum clnt_stat rpc_broadcast_exp(const rpcprog_t, const rpcvers_t,
704177633Sdfr					const rpcproc_t, const xdrproc_t,
705177633Sdfr					caddr_t, const xdrproc_t, caddr_t,
706177633Sdfr					const resultproc_t, const int,
707177633Sdfr					const int, const char *);
708177633Sdfr__END_DECLS
709177633Sdfr
710177633Sdfr/* For backward compatibility */
711177633Sdfr#include <rpc/clnt_soc.h>
712177633Sdfr#endif
713177633Sdfr
714177633Sdfr#endif /* !_RPC_CLNT_H_ */
715