clnt.h revision 180025
1177633Sdfr/*	$NetBSD: clnt.h,v 1.14 2000/06/02 22:57:55 fvdl Exp $	*/
2177633Sdfr
3177633Sdfr/*
4177633Sdfr * The contents of this file are subject to the Sun Standards
5177633Sdfr * License Version 1.0 the (the "License";) You may not use
6177633Sdfr * this file except in compliance with the License.  You may
7177633Sdfr * obtain a copy of the License at lib/libc/rpc/LICENSE
8177633Sdfr *
9177633Sdfr * Software distributed under the License is distributed on
10177633Sdfr * an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
11177633Sdfr * express or implied.  See the License for the specific
12177633Sdfr * language governing rights and limitations under the License.
13177633Sdfr *
14177633Sdfr * The Original Code is Copyright 1998 by Sun Microsystems, Inc
15177633Sdfr *
16177633Sdfr * The Initial Developer of the Original Code is:  Sun
17177633Sdfr * Microsystems, Inc.
18177633Sdfr *
19177633Sdfr * All Rights Reserved.
20177633Sdfr *
21177633Sdfr * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
22177633Sdfr * unrestricted use provided that this legend is included on all tape
23177633Sdfr * media and as a part of the software program in whole or part.  Users
24177633Sdfr * may copy or modify Sun RPC without charge, but are not authorized
25177633Sdfr * to license or distribute it to anyone else except as part of a product or
26177633Sdfr * program developed by the user.
27177633Sdfr *
28177633Sdfr * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
29177633Sdfr * WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
30177633Sdfr * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
31177633Sdfr *
32177633Sdfr * Sun RPC is provided with no support and without any obligation on the
33177633Sdfr * part of Sun Microsystems, Inc. to assist in its use, correction,
34177633Sdfr * modification or enhancement.
35177633Sdfr *
36177633Sdfr * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
37177633Sdfr * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
38177633Sdfr * OR ANY PART THEREOF.
39177633Sdfr *
40177633Sdfr * In no event will Sun Microsystems, Inc. be liable for any lost revenue
41177633Sdfr * or profits or other special, indirect and consequential damages, even if
42177633Sdfr * Sun has been advised of the possibility of such damages.
43177633Sdfr *
44177633Sdfr * Sun Microsystems, Inc.
45177633Sdfr * 2550 Garcia Avenue
46177633Sdfr * Mountain View, California  94043
47177633Sdfr *
48177633Sdfr *	from: @(#)clnt.h 1.31 94/04/29 SMI
49177633Sdfr *	from: @(#)clnt.h	2.1 88/07/29 4.0 RPCSRC
50177633Sdfr * $FreeBSD: head/sys/rpc/clnt.h 180025 2008-06-26 10:21:54Z dfr $
51177633Sdfr */
52177633Sdfr
53177633Sdfr/*
54177633Sdfr * clnt.h - Client side remote procedure call interface.
55177633Sdfr *
56177633Sdfr * Copyright (c) 1986-1991,1994-1999 by Sun Microsystems, Inc.
57177633Sdfr * All rights reserved.
58177633Sdfr */
59177633Sdfr
60177633Sdfr#ifndef _RPC_CLNT_H_
61177633Sdfr#define _RPC_CLNT_H_
62177633Sdfr#include <rpc/clnt_stat.h>
63177633Sdfr#include <sys/cdefs.h>
64177633Sdfr#ifdef _KERNEL
65180025Sdfr#include <sys/refcount.h>
66177633Sdfr#include <rpc/netconfig.h>
67177633Sdfr#else
68177633Sdfr#include <netconfig.h>
69177633Sdfr#endif
70177633Sdfr#include <sys/un.h>
71177633Sdfr
72177633Sdfr/*
73177633Sdfr * Well-known IPV6 RPC broadcast address.
74177633Sdfr */
75177633Sdfr#define RPCB_MULTICAST_ADDR "ff02::202"
76177633Sdfr
77177633Sdfr/*
78177633Sdfr * the following errors are in general unrecoverable.  The caller
79177633Sdfr * should give up rather than retry.
80177633Sdfr */
81177633Sdfr#define IS_UNRECOVERABLE_RPC(s) (((s) == RPC_AUTHERROR) || \
82177633Sdfr	((s) == RPC_CANTENCODEARGS) || \
83177633Sdfr	((s) == RPC_CANTDECODERES) || \
84177633Sdfr	((s) == RPC_VERSMISMATCH) || \
85177633Sdfr	((s) == RPC_PROCUNAVAIL) || \
86177633Sdfr	((s) == RPC_PROGUNAVAIL) || \
87177633Sdfr	((s) == RPC_PROGVERSMISMATCH) || \
88177633Sdfr	((s) == RPC_CANTDECODEARGS))
89177633Sdfr
90177633Sdfr/*
91177633Sdfr * Error info.
92177633Sdfr */
93177633Sdfrstruct rpc_err {
94177633Sdfr	enum clnt_stat re_status;
95177633Sdfr	union {
96177633Sdfr		int RE_errno;		/* related system error */
97177633Sdfr		enum auth_stat RE_why;	/* why the auth error occurred */
98177633Sdfr		struct {
99177633Sdfr			rpcvers_t low;	/* lowest version supported */
100177633Sdfr			rpcvers_t high;	/* highest version supported */
101177633Sdfr		} RE_vers;
102177633Sdfr		struct {		/* maybe meaningful if RPC_FAILED */
103177633Sdfr			int32_t s1;
104177633Sdfr			int32_t s2;
105177633Sdfr		} RE_lb;		/* life boot & debugging only */
106177633Sdfr	} ru;
107177633Sdfr#define	re_errno	ru.RE_errno
108177633Sdfr#define	re_why		ru.RE_why
109177633Sdfr#define	re_vers		ru.RE_vers
110177633Sdfr#define	re_lb		ru.RE_lb
111177633Sdfr};
112177633Sdfr
113180025Sdfr#ifdef _KERNEL
114180025Sdfr/*
115180025Sdfr * Functions of this type may be used to receive notification when RPC
116180025Sdfr * calls have to be re-transmitted etc.
117180025Sdfr */
118180025Sdfrtypedef void rpc_feedback(int cmd, int procnum, void *);
119177633Sdfr
120177633Sdfr/*
121180025Sdfr * A structure used with CLNT_CALL_EXT to pass extra information used
122180025Sdfr * while processing an RPC call.
123180025Sdfr */
124180025Sdfrstruct rpc_callextra {
125180025Sdfr	AUTH		*rc_auth;	/* auth handle to use for this call */
126180025Sdfr	rpc_feedback	*rc_feedback;	/* callback for retransmits etc. */
127180025Sdfr	void		*rc_feedback_arg; /* argument for callback */
128180025Sdfr};
129180025Sdfr#endif
130180025Sdfr
131180025Sdfr/*
132177633Sdfr * Client rpc handle.
133177633Sdfr * Created by individual implementations
134177633Sdfr * Client is responsible for initializing auth, see e.g. auth_none.c.
135177633Sdfr */
136177633Sdfrtypedef struct __rpc_client {
137180025Sdfr#ifdef _KERNEL
138180025Sdfr	volatile u_int cl_refs;			/* reference count */
139177633Sdfr	AUTH	*cl_auth;			/* authenticator */
140177633Sdfr	struct clnt_ops {
141177633Sdfr		/* call remote procedure */
142177633Sdfr		enum clnt_stat	(*cl_call)(struct __rpc_client *,
143180025Sdfr		    struct rpc_callextra *, rpcproc_t, xdrproc_t, void *,
144180025Sdfr		    xdrproc_t, void *, struct timeval);
145177633Sdfr		/* abort a call */
146177633Sdfr		void		(*cl_abort)(struct __rpc_client *);
147177633Sdfr		/* get specific error code */
148177633Sdfr		void		(*cl_geterr)(struct __rpc_client *,
149177633Sdfr					struct rpc_err *);
150177633Sdfr		/* frees results */
151177633Sdfr		bool_t		(*cl_freeres)(struct __rpc_client *,
152177633Sdfr					xdrproc_t, void *);
153177633Sdfr		/* destroy this structure */
154177633Sdfr		void		(*cl_destroy)(struct __rpc_client *);
155177633Sdfr		/* the ioctl() of rpc */
156177633Sdfr		bool_t          (*cl_control)(struct __rpc_client *, u_int,
157177633Sdfr				    void *);
158177633Sdfr	} *cl_ops;
159180025Sdfr#else
160180025Sdfr	AUTH	*cl_auth;			/* authenticator */
161180025Sdfr	struct clnt_ops {
162180025Sdfr		/* call remote procedure */
163180025Sdfr		enum clnt_stat	(*cl_call)(struct __rpc_client *,
164180025Sdfr		    rpcproc_t, xdrproc_t, void *, xdrproc_t,
165180025Sdfr		    void *, struct timeval);
166180025Sdfr		/* abort a call */
167180025Sdfr		void		(*cl_abort)(struct __rpc_client *);
168180025Sdfr		/* get specific error code */
169180025Sdfr		void		(*cl_geterr)(struct __rpc_client *,
170180025Sdfr					struct rpc_err *);
171180025Sdfr		/* frees results */
172180025Sdfr		bool_t		(*cl_freeres)(struct __rpc_client *,
173180025Sdfr					xdrproc_t, void *);
174180025Sdfr		/* destroy this structure */
175180025Sdfr		void		(*cl_destroy)(struct __rpc_client *);
176180025Sdfr		/* the ioctl() of rpc */
177180025Sdfr		bool_t          (*cl_control)(struct __rpc_client *, u_int,
178180025Sdfr				    void *);
179180025Sdfr	} *cl_ops;
180180025Sdfr#endif
181177633Sdfr	void 			*cl_private;	/* private stuff */
182177633Sdfr	char			*cl_netid;	/* network token */
183177633Sdfr	char			*cl_tp;		/* device name */
184177633Sdfr} CLIENT;
185177633Sdfr
186177633Sdfr/*
187177633Sdfr * Timers used for the pseudo-transport protocol when using datagrams
188177633Sdfr */
189177633Sdfrstruct rpc_timers {
190177633Sdfr	u_short		rt_srtt;	/* smoothed round-trip time */
191177633Sdfr	u_short		rt_deviate;	/* estimated deviation */
192177633Sdfr	u_long		rt_rtxcur;	/* current (backed-off) rto */
193177633Sdfr};
194177633Sdfr
195177633Sdfr/*
196177633Sdfr * Feedback values used for possible congestion and rate control
197177633Sdfr */
198180025Sdfr#define FEEDBACK_OK		1	/* no retransmits */
199180025Sdfr#define FEEDBACK_REXMIT1	2	/* first retransmit */
200180025Sdfr#define FEEDBACK_REXMIT2	3	/* second and subsequent retransmit */
201180025Sdfr#define FEEDBACK_RECONNECT	4	/* client reconnect */
202177633Sdfr
203177633Sdfr/* Used to set version of portmapper used in broadcast */
204177633Sdfr
205177633Sdfr#define CLCR_SET_LOWVERS	3
206177633Sdfr#define CLCR_GET_LOWVERS	4
207177633Sdfr
208177633Sdfr#define RPCSMALLMSGSIZE 400	/* a more reasonable packet size */
209177633Sdfr
210177633Sdfr/*
211177633Sdfr * client side rpc interface ops
212177633Sdfr *
213177633Sdfr * Parameter types are:
214177633Sdfr *
215177633Sdfr */
216177633Sdfr
217180025Sdfr#ifdef _KERNEL
218180025Sdfr#define CLNT_ACQUIRE(rh)			\
219180025Sdfr	refcount_acquire(&(rh)->cl_refs)
220180025Sdfr#define CLNT_RELEASE(rh)			\
221180025Sdfr	if (refcount_release(&(rh)->cl_refs))	\
222180025Sdfr		CLNT_DESTROY(rh)
223180025Sdfr
224177633Sdfr/*
225177633Sdfr * enum clnt_stat
226180025Sdfr * CLNT_CALL_EXT(rh, ext, proc, xargs, argsp, xres, resp, timeout)
227180025Sdfr * 	CLIENT *rh;
228180025Sdfr *	struct rpc_callextra *ext;
229180025Sdfr *	rpcproc_t proc;
230180025Sdfr *	xdrproc_t xargs;
231180025Sdfr *	void *argsp;
232180025Sdfr *	xdrproc_t xres;
233180025Sdfr *	void *resp;
234180025Sdfr *	struct timeval timeout;
235180025Sdfr */
236180025Sdfr#define	CLNT_CALL_EXT(rh, ext, proc, xargs, argsp, xres, resp, secs)	\
237180025Sdfr	((*(rh)->cl_ops->cl_call)(rh, ext, proc, xargs,		\
238180025Sdfr		argsp, xres, resp, secs))
239180025Sdfr#endif
240180025Sdfr
241180025Sdfr/*
242180025Sdfr * enum clnt_stat
243177633Sdfr * CLNT_CALL(rh, proc, xargs, argsp, xres, resp, timeout)
244177633Sdfr * 	CLIENT *rh;
245177633Sdfr *	rpcproc_t proc;
246177633Sdfr *	xdrproc_t xargs;
247177633Sdfr *	void *argsp;
248177633Sdfr *	xdrproc_t xres;
249177633Sdfr *	void *resp;
250177633Sdfr *	struct timeval timeout;
251177633Sdfr */
252180025Sdfr#ifdef _KERNEL
253180025Sdfr#define	CLNT_CALL(rh, proc, xargs, argsp, xres, resp, secs)		\
254180025Sdfr	((*(rh)->cl_ops->cl_call)(rh, NULL, proc, xargs,	\
255177633Sdfr		argsp, xres, resp, secs))
256180025Sdfr#define	clnt_call(rh, proc, xargs, argsp, xres, resp, secs)		\
257180025Sdfr	((*(rh)->cl_ops->cl_call)(rh, NULL, proc, xargs,	\
258177633Sdfr		argsp, xres, resp, secs))
259180025Sdfr#else
260180025Sdfr#define	CLNT_CALL(rh, proc, xargs, argsp, xres, resp, secs)		\
261180025Sdfr	((*(rh)->cl_ops->cl_call)(rh, proc, xargs,	\
262180025Sdfr		argsp, xres, resp, secs))
263180025Sdfr#define	clnt_call(rh, proc, xargs, argsp, xres, resp, secs)		\
264180025Sdfr	((*(rh)->cl_ops->cl_call)(rh, proc, xargs,	\
265180025Sdfr		argsp, xres, resp, secs))
266180025Sdfr#endif
267177633Sdfr
268177633Sdfr/*
269177633Sdfr * void
270177633Sdfr * CLNT_ABORT(rh);
271177633Sdfr * 	CLIENT *rh;
272177633Sdfr */
273177633Sdfr#define	CLNT_ABORT(rh)	((*(rh)->cl_ops->cl_abort)(rh))
274177633Sdfr#define	clnt_abort(rh)	((*(rh)->cl_ops->cl_abort)(rh))
275177633Sdfr
276177633Sdfr/*
277177633Sdfr * struct rpc_err
278177633Sdfr * CLNT_GETERR(rh);
279177633Sdfr * 	CLIENT *rh;
280177633Sdfr */
281177633Sdfr#define	CLNT_GETERR(rh,errp)	((*(rh)->cl_ops->cl_geterr)(rh, errp))
282177633Sdfr#define	clnt_geterr(rh,errp)	((*(rh)->cl_ops->cl_geterr)(rh, errp))
283177633Sdfr
284177633Sdfr
285177633Sdfr/*
286177633Sdfr * bool_t
287177633Sdfr * CLNT_FREERES(rh, xres, resp);
288177633Sdfr * 	CLIENT *rh;
289177633Sdfr *	xdrproc_t xres;
290177633Sdfr *	void *resp;
291177633Sdfr */
292177633Sdfr#define	CLNT_FREERES(rh,xres,resp) ((*(rh)->cl_ops->cl_freeres)(rh,xres,resp))
293177633Sdfr#define	clnt_freeres(rh,xres,resp) ((*(rh)->cl_ops->cl_freeres)(rh,xres,resp))
294177633Sdfr
295177633Sdfr/*
296177633Sdfr * bool_t
297177633Sdfr * CLNT_CONTROL(cl, request, info)
298177633Sdfr *      CLIENT *cl;
299177633Sdfr *      u_int request;
300177633Sdfr *      char *info;
301177633Sdfr */
302177633Sdfr#define	CLNT_CONTROL(cl,rq,in) ((*(cl)->cl_ops->cl_control)(cl,rq,in))
303177633Sdfr#define	clnt_control(cl,rq,in) ((*(cl)->cl_ops->cl_control)(cl,rq,in))
304177633Sdfr
305177633Sdfr/*
306177633Sdfr * control operations that apply to both udp and tcp transports
307177633Sdfr */
308177633Sdfr#define CLSET_TIMEOUT		1	/* set timeout (timeval) */
309177633Sdfr#define CLGET_TIMEOUT		2	/* get timeout (timeval) */
310177633Sdfr#define CLGET_SERVER_ADDR	3	/* get server's address (sockaddr) */
311177633Sdfr#define CLGET_FD		6	/* get connections file descriptor */
312177633Sdfr#define CLGET_SVC_ADDR		7	/* get server's address (netbuf) */
313177633Sdfr#define CLSET_FD_CLOSE		8	/* close fd while clnt_destroy */
314177633Sdfr#define CLSET_FD_NCLOSE		9	/* Do not close fd while clnt_destroy */
315177633Sdfr#define CLGET_XID 		10	/* Get xid */
316177633Sdfr#define CLSET_XID		11	/* Set xid */
317177633Sdfr#define CLGET_VERS		12	/* Get version number */
318177633Sdfr#define CLSET_VERS		13	/* Set version number */
319177633Sdfr#define CLGET_PROG		14	/* Get program number */
320177633Sdfr#define CLSET_PROG		15	/* Set program number */
321177633Sdfr#define CLSET_SVC_ADDR		16	/* get server's address (netbuf) */
322177633Sdfr#define CLSET_PUSH_TIMOD	17	/* push timod if not already present */
323177633Sdfr#define CLSET_POP_TIMOD		18	/* pop timod */
324177633Sdfr/*
325177633Sdfr * Connectionless only control operations
326177633Sdfr */
327177633Sdfr#define CLSET_RETRY_TIMEOUT 4   /* set retry timeout (timeval) */
328177633Sdfr#define CLGET_RETRY_TIMEOUT 5   /* get retry timeout (timeval) */
329177633Sdfr#define CLSET_ASYNC		19
330177633Sdfr#define CLSET_CONNECT		20	/* Use connect() for UDP. (int) */
331177633Sdfr
332177633Sdfr#ifdef _KERNEL
333177633Sdfr/*
334177633Sdfr * Kernel control operations. The default msleep string is "rpcrecv",
335177633Sdfr * and sleeps are non-interruptible by default.
336177633Sdfr */
337177633Sdfr#define CLSET_WAITCHAN		21	/* set string to use in msleep call */
338177633Sdfr#define CLGET_WAITCHAN		22	/* get string used in msleep call */
339177633Sdfr#define CLSET_INTERRUPTIBLE	23	/* set interruptible flag */
340177633Sdfr#define CLGET_INTERRUPTIBLE	24	/* set interruptible flag */
341180025Sdfr#define CLSET_RETRIES		25	/* set retry count for reconnect */
342180025Sdfr#define CLGET_RETRIES		26	/* get retry count for reconnect */
343177633Sdfr#endif
344177633Sdfr
345177633Sdfr
346177633Sdfr/*
347177633Sdfr * void
348177633Sdfr * CLNT_DESTROY(rh);
349177633Sdfr * 	CLIENT *rh;
350177633Sdfr */
351177633Sdfr#define	CLNT_DESTROY(rh)	((*(rh)->cl_ops->cl_destroy)(rh))
352177633Sdfr#define	clnt_destroy(rh)	((*(rh)->cl_ops->cl_destroy)(rh))
353177633Sdfr
354177633Sdfr
355177633Sdfr/*
356177633Sdfr * RPCTEST is a test program which is accessible on every rpc
357177633Sdfr * transport/port.  It is used for testing, performance evaluation,
358177633Sdfr * and network administration.
359177633Sdfr */
360177633Sdfr
361177633Sdfr#define RPCTEST_PROGRAM		((rpcprog_t)1)
362177633Sdfr#define RPCTEST_VERSION		((rpcvers_t)1)
363177633Sdfr#define RPCTEST_NULL_PROC	((rpcproc_t)2)
364177633Sdfr#define RPCTEST_NULL_BATCH_PROC	((rpcproc_t)3)
365177633Sdfr
366177633Sdfr/*
367177633Sdfr * By convention, procedure 0 takes null arguments and returns them
368177633Sdfr */
369177633Sdfr
370177633Sdfr#define NULLPROC ((rpcproc_t)0)
371177633Sdfr
372177633Sdfr/*
373177633Sdfr * Below are the client handle creation routines for the various
374177633Sdfr * implementations of client side rpc.  They can return NULL if a
375177633Sdfr * creation failure occurs.
376177633Sdfr */
377177633Sdfr
378177633Sdfr/*
379177633Sdfr * Generic client creation routine. Supported protocols are those that
380177633Sdfr * belong to the nettype namespace (/etc/netconfig).
381177633Sdfr */
382177633Sdfr__BEGIN_DECLS
383177633Sdfr#ifdef _KERNEL
384177633Sdfr
385177633Sdfr/*
386177633Sdfr *	struct socket *so;			-- socket
387177633Sdfr *	struct sockaddr *svcaddr;		-- servers address
388177633Sdfr *	rpcprog_t prog;				-- program number
389177633Sdfr *	rpcvers_t vers;				-- version number
390177633Sdfr *	size_t sendsz;				-- buffer recv size
391177633Sdfr *	size_t recvsz;				-- buffer send size
392177633Sdfr */
393177633Sdfrextern CLIENT *clnt_dg_create(struct socket *so,
394177633Sdfr    struct sockaddr *svcaddr, rpcprog_t program, rpcvers_t version,
395177633Sdfr    size_t sendsz, size_t recvsz);
396177633Sdfr
397177633Sdfr/*
398177633Sdfr *	struct socket *so;			-- socket
399177633Sdfr *	struct sockaddr *svcaddr;		-- servers address
400177633Sdfr *	rpcprog_t prog;				-- program number
401177633Sdfr *	rpcvers_t vers;				-- version number
402177633Sdfr *	size_t sendsz;				-- buffer recv size
403177633Sdfr *	size_t recvsz;				-- buffer send size
404177633Sdfr */
405177633Sdfrextern CLIENT *clnt_vc_create(struct socket *so,
406177633Sdfr    struct sockaddr *svcaddr, rpcprog_t program, rpcvers_t version,
407177633Sdfr    size_t sendsz, size_t recvsz);
408177633Sdfr
409177633Sdfr/*
410177633Sdfr *	struct netconfig *nconf;		-- network type
411177633Sdfr *	struct sockaddr *svcaddr;		-- servers address
412177633Sdfr *	rpcprog_t prog;				-- program number
413177633Sdfr *	rpcvers_t vers;				-- version number
414177633Sdfr *	size_t sendsz;				-- buffer recv size
415177633Sdfr *	size_t recvsz;				-- buffer send size
416177633Sdfr */
417177633Sdfrextern CLIENT *clnt_reconnect_create(struct netconfig *nconf,
418177633Sdfr    struct sockaddr *svcaddr, rpcprog_t program, rpcvers_t version,
419177633Sdfr    size_t sendsz, size_t recvsz);
420177633Sdfr
421177633Sdfr#else
422177633Sdfr
423177633Sdfrextern CLIENT *clnt_create(const char *, const rpcprog_t, const rpcvers_t,
424177633Sdfr			   const char *);
425177633Sdfr/*
426177633Sdfr *
427177633Sdfr * 	const char *hostname;			-- hostname
428177633Sdfr *	const rpcprog_t prog;			-- program number
429177633Sdfr *	const rpcvers_t vers;			-- version number
430177633Sdfr *	const char *nettype;			-- network type
431177633Sdfr */
432177633Sdfr
433177633Sdfr /*
434177633Sdfr * Generic client creation routine. Just like clnt_create(), except
435177633Sdfr * it takes an additional timeout parameter.
436177633Sdfr */
437177633Sdfrextern CLIENT * clnt_create_timed(const char *, const rpcprog_t,
438177633Sdfr	const rpcvers_t, const char *, const struct timeval *);
439177633Sdfr/*
440177633Sdfr *
441177633Sdfr *	const char *hostname;			-- hostname
442177633Sdfr *	const rpcprog_t prog;			-- program number
443177633Sdfr *	const rpcvers_t vers;			-- version number
444177633Sdfr *	const char *nettype;			-- network type
445177633Sdfr *	const struct timeval *tp;		-- timeout
446177633Sdfr */
447177633Sdfr
448177633Sdfr/*
449177633Sdfr * Generic client creation routine. Supported protocols are which belong
450177633Sdfr * to the nettype name space.
451177633Sdfr */
452177633Sdfrextern CLIENT *clnt_create_vers(const char *, const rpcprog_t, rpcvers_t *,
453177633Sdfr				const rpcvers_t, const rpcvers_t,
454177633Sdfr				const char *);
455177633Sdfr/*
456177633Sdfr *	const char *host;		-- hostname
457177633Sdfr *	const rpcprog_t prog;		-- program number
458177633Sdfr *	rpcvers_t *vers_out;		-- servers highest available version
459177633Sdfr *	const rpcvers_t vers_low;	-- low version number
460177633Sdfr *	const rpcvers_t vers_high;	-- high version number
461177633Sdfr *	const char *nettype;		-- network type
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_timed(const char *, const rpcprog_t,
469177633Sdfr	rpcvers_t *, const rpcvers_t, const rpcvers_t, const char *,
470177633Sdfr	const struct timeval *);
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 *	const struct timeval *tp	-- timeout
479177633Sdfr */
480177633Sdfr
481177633Sdfr/*
482177633Sdfr * Generic client creation routine. It takes a netconfig structure
483177633Sdfr * instead of nettype
484177633Sdfr */
485177633Sdfrextern CLIENT *clnt_tp_create(const char *, const rpcprog_t,
486177633Sdfr			      const rpcvers_t, const struct netconfig *);
487177633Sdfr/*
488177633Sdfr *	const char *hostname;			-- hostname
489177633Sdfr *	const rpcprog_t prog;			-- program number
490177633Sdfr *	const rpcvers_t vers;			-- version number
491177633Sdfr *	const struct netconfig *netconf; 	-- network config structure
492177633Sdfr */
493177633Sdfr
494177633Sdfr/*
495177633Sdfr * Generic client creation routine. Just like clnt_tp_create(), except
496177633Sdfr * it takes an additional timeout parameter.
497177633Sdfr */
498177633Sdfrextern CLIENT * clnt_tp_create_timed(const char *, const rpcprog_t,
499177633Sdfr	const rpcvers_t, const struct netconfig *, const struct timeval *);
500177633Sdfr/*
501177633Sdfr *	const char *hostname;			-- hostname
502177633Sdfr *	const rpcprog_t prog;			-- program number
503177633Sdfr *	const rpcvers_t vers;			-- version number
504177633Sdfr *	const struct netconfig *netconf; 	-- network config structure
505177633Sdfr *	const struct timeval *tp		-- timeout
506177633Sdfr */
507177633Sdfr
508177633Sdfr/*
509177633Sdfr * Generic TLI create routine. Only provided for compatibility.
510177633Sdfr */
511177633Sdfr
512177633Sdfrextern CLIENT *clnt_tli_create(const int, const struct netconfig *,
513177633Sdfr			       struct netbuf *, const rpcprog_t,
514177633Sdfr			       const rpcvers_t, const u_int, const u_int);
515177633Sdfr/*
516177633Sdfr *	const register int fd;		-- fd
517177633Sdfr *	const struct netconfig *nconf;	-- netconfig structure
518177633Sdfr *	struct netbuf *svcaddr;		-- servers address
519177633Sdfr *	const u_long prog;			-- program number
520177633Sdfr *	const u_long vers;			-- version number
521177633Sdfr *	const u_int sendsz;			-- send size
522177633Sdfr *	const u_int recvsz;			-- recv size
523177633Sdfr */
524177633Sdfr
525177633Sdfr/*
526177633Sdfr * Low level clnt create routine for connectionful transports, e.g. tcp.
527177633Sdfr */
528177633Sdfrextern CLIENT *clnt_vc_create(const int, const struct netbuf *,
529177633Sdfr			      const rpcprog_t, const rpcvers_t,
530177633Sdfr			      u_int, u_int);
531177633Sdfr/*
532177633Sdfr * Added for compatibility to old rpc 4.0. Obsoleted by clnt_vc_create().
533177633Sdfr */
534177633Sdfrextern CLIENT *clntunix_create(struct sockaddr_un *,
535177633Sdfr			       u_long, u_long, int *, u_int, u_int);
536177633Sdfr/*
537177633Sdfr *	const int fd;				-- open file descriptor
538177633Sdfr *	const struct netbuf *svcaddr;		-- servers address
539177633Sdfr *	const rpcprog_t prog;			-- program number
540177633Sdfr *	const rpcvers_t vers;			-- version number
541177633Sdfr *	const u_int sendsz;			-- buffer recv size
542177633Sdfr *	const u_int recvsz;			-- buffer send size
543177633Sdfr */
544177633Sdfr
545177633Sdfr/*
546177633Sdfr * Low level clnt create routine for connectionless transports, e.g. udp.
547177633Sdfr */
548177633Sdfrextern CLIENT *clnt_dg_create(const int, const struct netbuf *,
549177633Sdfr			      const rpcprog_t, const rpcvers_t,
550177633Sdfr			      const u_int, const u_int);
551177633Sdfr/*
552177633Sdfr *	const int fd;				-- open file descriptor
553177633Sdfr *	const struct netbuf *svcaddr;		-- servers address
554177633Sdfr *	const rpcprog_t program;		-- program number
555177633Sdfr *	const rpcvers_t version;		-- version number
556177633Sdfr *	const u_int sendsz;			-- buffer recv size
557177633Sdfr *	const u_int recvsz;			-- buffer send size
558177633Sdfr */
559177633Sdfr
560177633Sdfr/*
561177633Sdfr * Memory based rpc (for speed check and testing)
562177633Sdfr * CLIENT *
563177633Sdfr * clnt_raw_create(prog, vers)
564177633Sdfr *	u_long prog;
565177633Sdfr *	u_long vers;
566177633Sdfr */
567177633Sdfrextern CLIENT *clnt_raw_create(rpcprog_t, rpcvers_t);
568177633Sdfr#endif
569177633Sdfr
570177633Sdfr__END_DECLS
571177633Sdfr
572177633Sdfr
573177633Sdfr/*
574177633Sdfr * Print why creation failed
575177633Sdfr */
576177633Sdfr__BEGIN_DECLS
577177633Sdfrextern void clnt_pcreateerror(const char *);			/* stderr */
578177633Sdfrextern char *clnt_spcreateerror(const char *);			/* string */
579177633Sdfr__END_DECLS
580177633Sdfr
581177633Sdfr/*
582177633Sdfr * Like clnt_perror(), but is more verbose in its output
583177633Sdfr */
584177633Sdfr__BEGIN_DECLS
585177633Sdfrextern void clnt_perrno(enum clnt_stat);		/* stderr */
586177633Sdfrextern char *clnt_sperrno(enum clnt_stat);		/* string */
587177633Sdfr__END_DECLS
588177633Sdfr
589177633Sdfr/*
590177633Sdfr * Print an English error message, given the client error code
591177633Sdfr */
592177633Sdfr__BEGIN_DECLS
593177633Sdfrextern void clnt_perror(CLIENT *, const char *);	 	/* stderr */
594177633Sdfrextern char *clnt_sperror(CLIENT *, const char *);		/* string */
595177633Sdfr__END_DECLS
596177633Sdfr
597177633Sdfr
598177633Sdfr/*
599177633Sdfr * If a creation fails, the following allows the user to figure out why.
600177633Sdfr */
601177633Sdfrstruct rpc_createerr {
602177633Sdfr	enum clnt_stat cf_stat;
603177633Sdfr	struct rpc_err cf_error; /* useful when cf_stat == RPC_PMAPFAILURE */
604177633Sdfr};
605177633Sdfr
606177633Sdfr#ifdef _KERNEL
607177633Sdfrextern struct rpc_createerr rpc_createerr;
608177633Sdfr#else
609177633Sdfr__BEGIN_DECLS
610177633Sdfrextern struct rpc_createerr	*__rpc_createerr(void);
611177633Sdfr__END_DECLS
612177633Sdfr#define rpc_createerr		(*(__rpc_createerr()))
613177633Sdfr#endif
614177633Sdfr
615180025Sdfr#ifndef _KERNEL
616177633Sdfr/*
617177633Sdfr * The simplified interface:
618177633Sdfr * enum clnt_stat
619177633Sdfr * rpc_call(host, prognum, versnum, procnum, inproc, in, outproc, out, nettype)
620177633Sdfr *	const char *host;
621177633Sdfr *	const rpcprog_t prognum;
622177633Sdfr *	const rpcvers_t versnum;
623177633Sdfr *	const rpcproc_t procnum;
624177633Sdfr *	const xdrproc_t inproc, outproc;
625177633Sdfr *	const char *in;
626177633Sdfr *	char *out;
627177633Sdfr *	const char *nettype;
628177633Sdfr */
629177633Sdfr__BEGIN_DECLS
630177633Sdfrextern enum clnt_stat rpc_call(const char *, const rpcprog_t,
631177633Sdfr			       const rpcvers_t, const rpcproc_t,
632177633Sdfr			       const xdrproc_t, const char *,
633177633Sdfr			       const xdrproc_t, char *, const char *);
634177633Sdfr__END_DECLS
635177633Sdfr
636177633Sdfr/*
637177633Sdfr * RPC broadcast interface
638177633Sdfr * The call is broadcasted to all locally connected nets.
639177633Sdfr *
640177633Sdfr * extern enum clnt_stat
641177633Sdfr * rpc_broadcast(prog, vers, proc, xargs, argsp, xresults, resultsp,
642177633Sdfr *			eachresult, nettype)
643177633Sdfr *	const rpcprog_t		prog;		-- program number
644177633Sdfr *	const rpcvers_t		vers;		-- version number
645177633Sdfr *	const rpcproc_t		proc;		-- procedure number
646177633Sdfr *	const xdrproc_t	xargs;		-- xdr routine for args
647177633Sdfr *	caddr_t		argsp;		-- pointer to args
648177633Sdfr *	const xdrproc_t	xresults;	-- xdr routine for results
649177633Sdfr *	caddr_t		resultsp;	-- pointer to results
650177633Sdfr *	const resultproc_t	eachresult;	-- call with each result
651177633Sdfr *	const char		*nettype;	-- Transport type
652177633Sdfr *
653177633Sdfr * For each valid response received, the procedure eachresult is called.
654177633Sdfr * Its form is:
655177633Sdfr *		done = eachresult(resp, raddr, nconf)
656177633Sdfr *			bool_t done;
657177633Sdfr *			caddr_t resp;
658177633Sdfr *			struct netbuf *raddr;
659177633Sdfr *			struct netconfig *nconf;
660177633Sdfr * where resp points to the results of the call and raddr is the
661177633Sdfr * address if the responder to the broadcast.  nconf is the transport
662177633Sdfr * on which the response was received.
663177633Sdfr *
664177633Sdfr * extern enum clnt_stat
665177633Sdfr * rpc_broadcast_exp(prog, vers, proc, xargs, argsp, xresults, resultsp,
666177633Sdfr *			eachresult, inittime, waittime, nettype)
667177633Sdfr *	const rpcprog_t		prog;		-- program number
668177633Sdfr *	const rpcvers_t		vers;		-- version number
669177633Sdfr *	const rpcproc_t		proc;		-- procedure number
670177633Sdfr *	const xdrproc_t	xargs;		-- xdr routine for args
671177633Sdfr *	caddr_t		argsp;		-- pointer to args
672177633Sdfr *	const xdrproc_t	xresults;	-- xdr routine for results
673177633Sdfr *	caddr_t		resultsp;	-- pointer to results
674177633Sdfr *	const resultproc_t	eachresult;	-- call with each result
675177633Sdfr *	const int 		inittime;	-- how long to wait initially
676177633Sdfr *	const int 		waittime;	-- maximum time to wait
677177633Sdfr *	const char		*nettype;	-- Transport type
678177633Sdfr */
679177633Sdfr
680177633Sdfrtypedef bool_t (*resultproc_t)(caddr_t, ...);
681177633Sdfr
682177633Sdfr__BEGIN_DECLS
683177633Sdfrextern enum clnt_stat rpc_broadcast(const rpcprog_t, const rpcvers_t,
684177633Sdfr				    const rpcproc_t, const xdrproc_t,
685177633Sdfr				    caddr_t, const xdrproc_t, caddr_t,
686177633Sdfr				    const resultproc_t, const char *);
687177633Sdfrextern enum clnt_stat rpc_broadcast_exp(const rpcprog_t, const rpcvers_t,
688177633Sdfr					const rpcproc_t, const xdrproc_t,
689177633Sdfr					caddr_t, const xdrproc_t, caddr_t,
690177633Sdfr					const resultproc_t, const int,
691177633Sdfr					const int, const char *);
692177633Sdfr__END_DECLS
693177633Sdfr
694177633Sdfr/* For backward compatibility */
695177633Sdfr#include <rpc/clnt_soc.h>
696177633Sdfr#endif
697177633Sdfr
698177633Sdfr#endif /* !_RPC_CLNT_H_ */
699