clnt.h revision 177633
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 177633 2008-03-26 15:23:12Z 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
65177633Sdfr#include <rpc/netconfig.h>
66177633Sdfr#else
67177633Sdfr#include <netconfig.h>
68177633Sdfr#endif
69177633Sdfr#include <sys/un.h>
70177633Sdfr
71177633Sdfr/*
72177633Sdfr * Well-known IPV6 RPC broadcast address.
73177633Sdfr */
74177633Sdfr#define RPCB_MULTICAST_ADDR "ff02::202"
75177633Sdfr
76177633Sdfr/*
77177633Sdfr * the following errors are in general unrecoverable.  The caller
78177633Sdfr * should give up rather than retry.
79177633Sdfr */
80177633Sdfr#define IS_UNRECOVERABLE_RPC(s) (((s) == RPC_AUTHERROR) || \
81177633Sdfr	((s) == RPC_CANTENCODEARGS) || \
82177633Sdfr	((s) == RPC_CANTDECODERES) || \
83177633Sdfr	((s) == RPC_VERSMISMATCH) || \
84177633Sdfr	((s) == RPC_PROCUNAVAIL) || \
85177633Sdfr	((s) == RPC_PROGUNAVAIL) || \
86177633Sdfr	((s) == RPC_PROGVERSMISMATCH) || \
87177633Sdfr	((s) == RPC_CANTDECODEARGS))
88177633Sdfr
89177633Sdfr/*
90177633Sdfr * Error info.
91177633Sdfr */
92177633Sdfrstruct rpc_err {
93177633Sdfr	enum clnt_stat re_status;
94177633Sdfr	union {
95177633Sdfr		int RE_errno;		/* related system error */
96177633Sdfr		enum auth_stat RE_why;	/* why the auth error occurred */
97177633Sdfr		struct {
98177633Sdfr			rpcvers_t low;	/* lowest version supported */
99177633Sdfr			rpcvers_t high;	/* highest version supported */
100177633Sdfr		} RE_vers;
101177633Sdfr		struct {		/* maybe meaningful if RPC_FAILED */
102177633Sdfr			int32_t s1;
103177633Sdfr			int32_t s2;
104177633Sdfr		} RE_lb;		/* life boot & debugging only */
105177633Sdfr	} ru;
106177633Sdfr#define	re_errno	ru.RE_errno
107177633Sdfr#define	re_why		ru.RE_why
108177633Sdfr#define	re_vers		ru.RE_vers
109177633Sdfr#define	re_lb		ru.RE_lb
110177633Sdfr};
111177633Sdfr
112177633Sdfr
113177633Sdfr/*
114177633Sdfr * Client rpc handle.
115177633Sdfr * Created by individual implementations
116177633Sdfr * Client is responsible for initializing auth, see e.g. auth_none.c.
117177633Sdfr */
118177633Sdfrtypedef struct __rpc_client {
119177633Sdfr	AUTH	*cl_auth;			/* authenticator */
120177633Sdfr	struct clnt_ops {
121177633Sdfr		/* call remote procedure */
122177633Sdfr		enum clnt_stat	(*cl_call)(struct __rpc_client *,
123177633Sdfr				    rpcproc_t, xdrproc_t, void *, xdrproc_t,
124177633Sdfr				        void *, struct timeval);
125177633Sdfr		/* abort a call */
126177633Sdfr		void		(*cl_abort)(struct __rpc_client *);
127177633Sdfr		/* get specific error code */
128177633Sdfr		void		(*cl_geterr)(struct __rpc_client *,
129177633Sdfr					struct rpc_err *);
130177633Sdfr		/* frees results */
131177633Sdfr		bool_t		(*cl_freeres)(struct __rpc_client *,
132177633Sdfr					xdrproc_t, void *);
133177633Sdfr		/* destroy this structure */
134177633Sdfr		void		(*cl_destroy)(struct __rpc_client *);
135177633Sdfr		/* the ioctl() of rpc */
136177633Sdfr		bool_t          (*cl_control)(struct __rpc_client *, u_int,
137177633Sdfr				    void *);
138177633Sdfr	} *cl_ops;
139177633Sdfr	void 			*cl_private;	/* private stuff */
140177633Sdfr	char			*cl_netid;	/* network token */
141177633Sdfr	char			*cl_tp;		/* device name */
142177633Sdfr} CLIENT;
143177633Sdfr
144177633Sdfr
145177633Sdfr/*
146177633Sdfr * Timers used for the pseudo-transport protocol when using datagrams
147177633Sdfr */
148177633Sdfrstruct rpc_timers {
149177633Sdfr	u_short		rt_srtt;	/* smoothed round-trip time */
150177633Sdfr	u_short		rt_deviate;	/* estimated deviation */
151177633Sdfr	u_long		rt_rtxcur;	/* current (backed-off) rto */
152177633Sdfr};
153177633Sdfr
154177633Sdfr/*
155177633Sdfr * Feedback values used for possible congestion and rate control
156177633Sdfr */
157177633Sdfr#define FEEDBACK_REXMIT1	1	/* first retransmit */
158177633Sdfr#define FEEDBACK_OK		2	/* no retransmits */
159177633Sdfr
160177633Sdfr/* Used to set version of portmapper used in broadcast */
161177633Sdfr
162177633Sdfr#define CLCR_SET_LOWVERS	3
163177633Sdfr#define CLCR_GET_LOWVERS	4
164177633Sdfr
165177633Sdfr#define RPCSMALLMSGSIZE 400	/* a more reasonable packet size */
166177633Sdfr
167177633Sdfr/*
168177633Sdfr * client side rpc interface ops
169177633Sdfr *
170177633Sdfr * Parameter types are:
171177633Sdfr *
172177633Sdfr */
173177633Sdfr
174177633Sdfr/*
175177633Sdfr * enum clnt_stat
176177633Sdfr * CLNT_CALL(rh, proc, xargs, argsp, xres, resp, timeout)
177177633Sdfr * 	CLIENT *rh;
178177633Sdfr *	rpcproc_t proc;
179177633Sdfr *	xdrproc_t xargs;
180177633Sdfr *	void *argsp;
181177633Sdfr *	xdrproc_t xres;
182177633Sdfr *	void *resp;
183177633Sdfr *	struct timeval timeout;
184177633Sdfr */
185177633Sdfr#define	CLNT_CALL(rh, proc, xargs, argsp, xres, resp, secs) \
186177633Sdfr	((*(rh)->cl_ops->cl_call)(rh, proc, xargs, \
187177633Sdfr		argsp, xres, resp, secs))
188177633Sdfr#define	clnt_call(rh, proc, xargs, argsp, xres, resp, secs) \
189177633Sdfr	((*(rh)->cl_ops->cl_call)(rh, proc, xargs, \
190177633Sdfr		argsp, xres, resp, secs))
191177633Sdfr
192177633Sdfr/*
193177633Sdfr * void
194177633Sdfr * CLNT_ABORT(rh);
195177633Sdfr * 	CLIENT *rh;
196177633Sdfr */
197177633Sdfr#define	CLNT_ABORT(rh)	((*(rh)->cl_ops->cl_abort)(rh))
198177633Sdfr#define	clnt_abort(rh)	((*(rh)->cl_ops->cl_abort)(rh))
199177633Sdfr
200177633Sdfr/*
201177633Sdfr * struct rpc_err
202177633Sdfr * CLNT_GETERR(rh);
203177633Sdfr * 	CLIENT *rh;
204177633Sdfr */
205177633Sdfr#define	CLNT_GETERR(rh,errp)	((*(rh)->cl_ops->cl_geterr)(rh, errp))
206177633Sdfr#define	clnt_geterr(rh,errp)	((*(rh)->cl_ops->cl_geterr)(rh, errp))
207177633Sdfr
208177633Sdfr
209177633Sdfr/*
210177633Sdfr * bool_t
211177633Sdfr * CLNT_FREERES(rh, xres, resp);
212177633Sdfr * 	CLIENT *rh;
213177633Sdfr *	xdrproc_t xres;
214177633Sdfr *	void *resp;
215177633Sdfr */
216177633Sdfr#define	CLNT_FREERES(rh,xres,resp) ((*(rh)->cl_ops->cl_freeres)(rh,xres,resp))
217177633Sdfr#define	clnt_freeres(rh,xres,resp) ((*(rh)->cl_ops->cl_freeres)(rh,xres,resp))
218177633Sdfr
219177633Sdfr/*
220177633Sdfr * bool_t
221177633Sdfr * CLNT_CONTROL(cl, request, info)
222177633Sdfr *      CLIENT *cl;
223177633Sdfr *      u_int request;
224177633Sdfr *      char *info;
225177633Sdfr */
226177633Sdfr#define	CLNT_CONTROL(cl,rq,in) ((*(cl)->cl_ops->cl_control)(cl,rq,in))
227177633Sdfr#define	clnt_control(cl,rq,in) ((*(cl)->cl_ops->cl_control)(cl,rq,in))
228177633Sdfr
229177633Sdfr/*
230177633Sdfr * control operations that apply to both udp and tcp transports
231177633Sdfr */
232177633Sdfr#define CLSET_TIMEOUT		1	/* set timeout (timeval) */
233177633Sdfr#define CLGET_TIMEOUT		2	/* get timeout (timeval) */
234177633Sdfr#define CLGET_SERVER_ADDR	3	/* get server's address (sockaddr) */
235177633Sdfr#define CLGET_FD		6	/* get connections file descriptor */
236177633Sdfr#define CLGET_SVC_ADDR		7	/* get server's address (netbuf) */
237177633Sdfr#define CLSET_FD_CLOSE		8	/* close fd while clnt_destroy */
238177633Sdfr#define CLSET_FD_NCLOSE		9	/* Do not close fd while clnt_destroy */
239177633Sdfr#define CLGET_XID 		10	/* Get xid */
240177633Sdfr#define CLSET_XID		11	/* Set xid */
241177633Sdfr#define CLGET_VERS		12	/* Get version number */
242177633Sdfr#define CLSET_VERS		13	/* Set version number */
243177633Sdfr#define CLGET_PROG		14	/* Get program number */
244177633Sdfr#define CLSET_PROG		15	/* Set program number */
245177633Sdfr#define CLSET_SVC_ADDR		16	/* get server's address (netbuf) */
246177633Sdfr#define CLSET_PUSH_TIMOD	17	/* push timod if not already present */
247177633Sdfr#define CLSET_POP_TIMOD		18	/* pop timod */
248177633Sdfr/*
249177633Sdfr * Connectionless only control operations
250177633Sdfr */
251177633Sdfr#define CLSET_RETRY_TIMEOUT 4   /* set retry timeout (timeval) */
252177633Sdfr#define CLGET_RETRY_TIMEOUT 5   /* get retry timeout (timeval) */
253177633Sdfr#define CLSET_ASYNC		19
254177633Sdfr#define CLSET_CONNECT		20	/* Use connect() for UDP. (int) */
255177633Sdfr
256177633Sdfr#ifdef _KERNEL
257177633Sdfr/*
258177633Sdfr * Kernel control operations. The default msleep string is "rpcrecv",
259177633Sdfr * and sleeps are non-interruptible by default.
260177633Sdfr */
261177633Sdfr#define CLSET_WAITCHAN		21	/* set string to use in msleep call */
262177633Sdfr#define CLGET_WAITCHAN		22	/* get string used in msleep call */
263177633Sdfr#define CLSET_INTERRUPTIBLE	23	/* set interruptible flag */
264177633Sdfr#define CLGET_INTERRUPTIBLE	24	/* set interruptible flag */
265177633Sdfr#endif
266177633Sdfr
267177633Sdfr
268177633Sdfr/*
269177633Sdfr * void
270177633Sdfr * CLNT_DESTROY(rh);
271177633Sdfr * 	CLIENT *rh;
272177633Sdfr */
273177633Sdfr#define	CLNT_DESTROY(rh)	((*(rh)->cl_ops->cl_destroy)(rh))
274177633Sdfr#define	clnt_destroy(rh)	((*(rh)->cl_ops->cl_destroy)(rh))
275177633Sdfr
276177633Sdfr
277177633Sdfr/*
278177633Sdfr * RPCTEST is a test program which is accessible on every rpc
279177633Sdfr * transport/port.  It is used for testing, performance evaluation,
280177633Sdfr * and network administration.
281177633Sdfr */
282177633Sdfr
283177633Sdfr#define RPCTEST_PROGRAM		((rpcprog_t)1)
284177633Sdfr#define RPCTEST_VERSION		((rpcvers_t)1)
285177633Sdfr#define RPCTEST_NULL_PROC	((rpcproc_t)2)
286177633Sdfr#define RPCTEST_NULL_BATCH_PROC	((rpcproc_t)3)
287177633Sdfr
288177633Sdfr/*
289177633Sdfr * By convention, procedure 0 takes null arguments and returns them
290177633Sdfr */
291177633Sdfr
292177633Sdfr#define NULLPROC ((rpcproc_t)0)
293177633Sdfr
294177633Sdfr/*
295177633Sdfr * Below are the client handle creation routines for the various
296177633Sdfr * implementations of client side rpc.  They can return NULL if a
297177633Sdfr * creation failure occurs.
298177633Sdfr */
299177633Sdfr
300177633Sdfr/*
301177633Sdfr * Generic client creation routine. Supported protocols are those that
302177633Sdfr * belong to the nettype namespace (/etc/netconfig).
303177633Sdfr */
304177633Sdfr__BEGIN_DECLS
305177633Sdfr#ifdef _KERNEL
306177633Sdfr
307177633Sdfr/*
308177633Sdfr *	struct socket *so;			-- socket
309177633Sdfr *	struct sockaddr *svcaddr;		-- servers address
310177633Sdfr *	rpcprog_t prog;				-- program number
311177633Sdfr *	rpcvers_t vers;				-- version number
312177633Sdfr *	size_t sendsz;				-- buffer recv size
313177633Sdfr *	size_t recvsz;				-- buffer send size
314177633Sdfr */
315177633Sdfrextern CLIENT *clnt_dg_create(struct socket *so,
316177633Sdfr    struct sockaddr *svcaddr, rpcprog_t program, rpcvers_t version,
317177633Sdfr    size_t sendsz, size_t recvsz);
318177633Sdfr
319177633Sdfr/*
320177633Sdfr *	struct socket *so;			-- socket
321177633Sdfr *	struct sockaddr *svcaddr;		-- servers address
322177633Sdfr *	rpcprog_t prog;				-- program number
323177633Sdfr *	rpcvers_t vers;				-- version number
324177633Sdfr *	size_t sendsz;				-- buffer recv size
325177633Sdfr *	size_t recvsz;				-- buffer send size
326177633Sdfr */
327177633Sdfrextern CLIENT *clnt_vc_create(struct socket *so,
328177633Sdfr    struct sockaddr *svcaddr, rpcprog_t program, rpcvers_t version,
329177633Sdfr    size_t sendsz, size_t recvsz);
330177633Sdfr
331177633Sdfr/*
332177633Sdfr *	struct netconfig *nconf;		-- network type
333177633Sdfr *	struct sockaddr *svcaddr;		-- servers address
334177633Sdfr *	rpcprog_t prog;				-- program number
335177633Sdfr *	rpcvers_t vers;				-- version number
336177633Sdfr *	size_t sendsz;				-- buffer recv size
337177633Sdfr *	size_t recvsz;				-- buffer send size
338177633Sdfr */
339177633Sdfrextern CLIENT *clnt_reconnect_create(struct netconfig *nconf,
340177633Sdfr    struct sockaddr *svcaddr, rpcprog_t program, rpcvers_t version,
341177633Sdfr    size_t sendsz, size_t recvsz);
342177633Sdfr
343177633Sdfr#else
344177633Sdfr
345177633Sdfrextern CLIENT *clnt_create(const char *, const rpcprog_t, const rpcvers_t,
346177633Sdfr			   const char *);
347177633Sdfr/*
348177633Sdfr *
349177633Sdfr * 	const char *hostname;			-- hostname
350177633Sdfr *	const rpcprog_t prog;			-- program number
351177633Sdfr *	const rpcvers_t vers;			-- version number
352177633Sdfr *	const char *nettype;			-- network type
353177633Sdfr */
354177633Sdfr
355177633Sdfr /*
356177633Sdfr * Generic client creation routine. Just like clnt_create(), except
357177633Sdfr * it takes an additional timeout parameter.
358177633Sdfr */
359177633Sdfrextern CLIENT * clnt_create_timed(const char *, const rpcprog_t,
360177633Sdfr	const rpcvers_t, const char *, const struct timeval *);
361177633Sdfr/*
362177633Sdfr *
363177633Sdfr *	const char *hostname;			-- hostname
364177633Sdfr *	const rpcprog_t prog;			-- program number
365177633Sdfr *	const rpcvers_t vers;			-- version number
366177633Sdfr *	const char *nettype;			-- network type
367177633Sdfr *	const struct timeval *tp;		-- timeout
368177633Sdfr */
369177633Sdfr
370177633Sdfr/*
371177633Sdfr * Generic client creation routine. Supported protocols are which belong
372177633Sdfr * to the nettype name space.
373177633Sdfr */
374177633Sdfrextern CLIENT *clnt_create_vers(const char *, const rpcprog_t, rpcvers_t *,
375177633Sdfr				const rpcvers_t, const rpcvers_t,
376177633Sdfr				const char *);
377177633Sdfr/*
378177633Sdfr *	const char *host;		-- hostname
379177633Sdfr *	const rpcprog_t prog;		-- program number
380177633Sdfr *	rpcvers_t *vers_out;		-- servers highest available version
381177633Sdfr *	const rpcvers_t vers_low;	-- low version number
382177633Sdfr *	const rpcvers_t vers_high;	-- high version number
383177633Sdfr *	const char *nettype;		-- network type
384177633Sdfr */
385177633Sdfr
386177633Sdfr/*
387177633Sdfr * Generic client creation routine. Supported protocols are which belong
388177633Sdfr * to the nettype name space.
389177633Sdfr */
390177633Sdfrextern CLIENT * clnt_create_vers_timed(const char *, const rpcprog_t,
391177633Sdfr	rpcvers_t *, const rpcvers_t, const rpcvers_t, const char *,
392177633Sdfr	const struct timeval *);
393177633Sdfr/*
394177633Sdfr *	const char *host;		-- hostname
395177633Sdfr *	const rpcprog_t prog;		-- program number
396177633Sdfr *	rpcvers_t *vers_out;		-- servers highest available version
397177633Sdfr *	const rpcvers_t vers_low;	-- low version number
398177633Sdfr *	const rpcvers_t vers_high;	-- high version number
399177633Sdfr *	const char *nettype;		-- network type
400177633Sdfr *	const struct timeval *tp	-- timeout
401177633Sdfr */
402177633Sdfr
403177633Sdfr/*
404177633Sdfr * Generic client creation routine. It takes a netconfig structure
405177633Sdfr * instead of nettype
406177633Sdfr */
407177633Sdfrextern CLIENT *clnt_tp_create(const char *, const rpcprog_t,
408177633Sdfr			      const rpcvers_t, const struct netconfig *);
409177633Sdfr/*
410177633Sdfr *	const char *hostname;			-- hostname
411177633Sdfr *	const rpcprog_t prog;			-- program number
412177633Sdfr *	const rpcvers_t vers;			-- version number
413177633Sdfr *	const struct netconfig *netconf; 	-- network config structure
414177633Sdfr */
415177633Sdfr
416177633Sdfr/*
417177633Sdfr * Generic client creation routine. Just like clnt_tp_create(), except
418177633Sdfr * it takes an additional timeout parameter.
419177633Sdfr */
420177633Sdfrextern CLIENT * clnt_tp_create_timed(const char *, const rpcprog_t,
421177633Sdfr	const rpcvers_t, const struct netconfig *, const struct timeval *);
422177633Sdfr/*
423177633Sdfr *	const char *hostname;			-- hostname
424177633Sdfr *	const rpcprog_t prog;			-- program number
425177633Sdfr *	const rpcvers_t vers;			-- version number
426177633Sdfr *	const struct netconfig *netconf; 	-- network config structure
427177633Sdfr *	const struct timeval *tp		-- timeout
428177633Sdfr */
429177633Sdfr
430177633Sdfr/*
431177633Sdfr * Generic TLI create routine. Only provided for compatibility.
432177633Sdfr */
433177633Sdfr
434177633Sdfrextern CLIENT *clnt_tli_create(const int, const struct netconfig *,
435177633Sdfr			       struct netbuf *, const rpcprog_t,
436177633Sdfr			       const rpcvers_t, const u_int, const u_int);
437177633Sdfr/*
438177633Sdfr *	const register int fd;		-- fd
439177633Sdfr *	const struct netconfig *nconf;	-- netconfig structure
440177633Sdfr *	struct netbuf *svcaddr;		-- servers address
441177633Sdfr *	const u_long prog;			-- program number
442177633Sdfr *	const u_long vers;			-- version number
443177633Sdfr *	const u_int sendsz;			-- send size
444177633Sdfr *	const u_int recvsz;			-- recv size
445177633Sdfr */
446177633Sdfr
447177633Sdfr/*
448177633Sdfr * Low level clnt create routine for connectionful transports, e.g. tcp.
449177633Sdfr */
450177633Sdfrextern CLIENT *clnt_vc_create(const int, const struct netbuf *,
451177633Sdfr			      const rpcprog_t, const rpcvers_t,
452177633Sdfr			      u_int, u_int);
453177633Sdfr/*
454177633Sdfr * Added for compatibility to old rpc 4.0. Obsoleted by clnt_vc_create().
455177633Sdfr */
456177633Sdfrextern CLIENT *clntunix_create(struct sockaddr_un *,
457177633Sdfr			       u_long, u_long, int *, u_int, u_int);
458177633Sdfr/*
459177633Sdfr *	const int fd;				-- open file descriptor
460177633Sdfr *	const struct netbuf *svcaddr;		-- servers address
461177633Sdfr *	const rpcprog_t prog;			-- program number
462177633Sdfr *	const rpcvers_t vers;			-- version number
463177633Sdfr *	const u_int sendsz;			-- buffer recv size
464177633Sdfr *	const u_int recvsz;			-- buffer send size
465177633Sdfr */
466177633Sdfr
467177633Sdfr/*
468177633Sdfr * Low level clnt create routine for connectionless transports, e.g. udp.
469177633Sdfr */
470177633Sdfrextern CLIENT *clnt_dg_create(const int, const struct netbuf *,
471177633Sdfr			      const rpcprog_t, const rpcvers_t,
472177633Sdfr			      const u_int, const u_int);
473177633Sdfr/*
474177633Sdfr *	const int fd;				-- open file descriptor
475177633Sdfr *	const struct netbuf *svcaddr;		-- servers address
476177633Sdfr *	const rpcprog_t program;		-- program number
477177633Sdfr *	const rpcvers_t version;		-- version number
478177633Sdfr *	const u_int sendsz;			-- buffer recv size
479177633Sdfr *	const u_int recvsz;			-- buffer send size
480177633Sdfr */
481177633Sdfr
482177633Sdfr/*
483177633Sdfr * Memory based rpc (for speed check and testing)
484177633Sdfr * CLIENT *
485177633Sdfr * clnt_raw_create(prog, vers)
486177633Sdfr *	u_long prog;
487177633Sdfr *	u_long vers;
488177633Sdfr */
489177633Sdfrextern CLIENT *clnt_raw_create(rpcprog_t, rpcvers_t);
490177633Sdfr#endif
491177633Sdfr
492177633Sdfr__END_DECLS
493177633Sdfr
494177633Sdfr
495177633Sdfr/*
496177633Sdfr * Print why creation failed
497177633Sdfr */
498177633Sdfr__BEGIN_DECLS
499177633Sdfrextern void clnt_pcreateerror(const char *);			/* stderr */
500177633Sdfrextern char *clnt_spcreateerror(const char *);			/* string */
501177633Sdfr__END_DECLS
502177633Sdfr
503177633Sdfr/*
504177633Sdfr * Like clnt_perror(), but is more verbose in its output
505177633Sdfr */
506177633Sdfr__BEGIN_DECLS
507177633Sdfrextern void clnt_perrno(enum clnt_stat);		/* stderr */
508177633Sdfrextern char *clnt_sperrno(enum clnt_stat);		/* string */
509177633Sdfr__END_DECLS
510177633Sdfr
511177633Sdfr/*
512177633Sdfr * Print an English error message, given the client error code
513177633Sdfr */
514177633Sdfr__BEGIN_DECLS
515177633Sdfrextern void clnt_perror(CLIENT *, const char *);	 	/* stderr */
516177633Sdfrextern char *clnt_sperror(CLIENT *, const char *);		/* string */
517177633Sdfr__END_DECLS
518177633Sdfr
519177633Sdfr
520177633Sdfr/*
521177633Sdfr * If a creation fails, the following allows the user to figure out why.
522177633Sdfr */
523177633Sdfrstruct rpc_createerr {
524177633Sdfr	enum clnt_stat cf_stat;
525177633Sdfr	struct rpc_err cf_error; /* useful when cf_stat == RPC_PMAPFAILURE */
526177633Sdfr};
527177633Sdfr
528177633Sdfr#ifdef _KERNEL
529177633Sdfrextern struct rpc_createerr rpc_createerr;
530177633Sdfr#else
531177633Sdfr__BEGIN_DECLS
532177633Sdfrextern struct rpc_createerr	*__rpc_createerr(void);
533177633Sdfr__END_DECLS
534177633Sdfr#define rpc_createerr		(*(__rpc_createerr()))
535177633Sdfr#endif
536177633Sdfr
537177633Sdfr/*
538177633Sdfr * The simplified interface:
539177633Sdfr * enum clnt_stat
540177633Sdfr * rpc_call(host, prognum, versnum, procnum, inproc, in, outproc, out, nettype)
541177633Sdfr *	const char *host;
542177633Sdfr *	const rpcprog_t prognum;
543177633Sdfr *	const rpcvers_t versnum;
544177633Sdfr *	const rpcproc_t procnum;
545177633Sdfr *	const xdrproc_t inproc, outproc;
546177633Sdfr *	const char *in;
547177633Sdfr *	char *out;
548177633Sdfr *	const char *nettype;
549177633Sdfr */
550177633Sdfr__BEGIN_DECLS
551177633Sdfrextern enum clnt_stat rpc_call(const char *, const rpcprog_t,
552177633Sdfr			       const rpcvers_t, const rpcproc_t,
553177633Sdfr			       const xdrproc_t, const char *,
554177633Sdfr			       const xdrproc_t, char *, const char *);
555177633Sdfr__END_DECLS
556177633Sdfr
557177633Sdfr/*
558177633Sdfr * RPC broadcast interface
559177633Sdfr * The call is broadcasted to all locally connected nets.
560177633Sdfr *
561177633Sdfr * extern enum clnt_stat
562177633Sdfr * rpc_broadcast(prog, vers, proc, xargs, argsp, xresults, resultsp,
563177633Sdfr *			eachresult, nettype)
564177633Sdfr *	const rpcprog_t		prog;		-- program number
565177633Sdfr *	const rpcvers_t		vers;		-- version number
566177633Sdfr *	const rpcproc_t		proc;		-- procedure number
567177633Sdfr *	const xdrproc_t	xargs;		-- xdr routine for args
568177633Sdfr *	caddr_t		argsp;		-- pointer to args
569177633Sdfr *	const xdrproc_t	xresults;	-- xdr routine for results
570177633Sdfr *	caddr_t		resultsp;	-- pointer to results
571177633Sdfr *	const resultproc_t	eachresult;	-- call with each result
572177633Sdfr *	const char		*nettype;	-- Transport type
573177633Sdfr *
574177633Sdfr * For each valid response received, the procedure eachresult is called.
575177633Sdfr * Its form is:
576177633Sdfr *		done = eachresult(resp, raddr, nconf)
577177633Sdfr *			bool_t done;
578177633Sdfr *			caddr_t resp;
579177633Sdfr *			struct netbuf *raddr;
580177633Sdfr *			struct netconfig *nconf;
581177633Sdfr * where resp points to the results of the call and raddr is the
582177633Sdfr * address if the responder to the broadcast.  nconf is the transport
583177633Sdfr * on which the response was received.
584177633Sdfr *
585177633Sdfr * extern enum clnt_stat
586177633Sdfr * rpc_broadcast_exp(prog, vers, proc, xargs, argsp, xresults, resultsp,
587177633Sdfr *			eachresult, inittime, waittime, nettype)
588177633Sdfr *	const rpcprog_t		prog;		-- program number
589177633Sdfr *	const rpcvers_t		vers;		-- version number
590177633Sdfr *	const rpcproc_t		proc;		-- procedure number
591177633Sdfr *	const xdrproc_t	xargs;		-- xdr routine for args
592177633Sdfr *	caddr_t		argsp;		-- pointer to args
593177633Sdfr *	const xdrproc_t	xresults;	-- xdr routine for results
594177633Sdfr *	caddr_t		resultsp;	-- pointer to results
595177633Sdfr *	const resultproc_t	eachresult;	-- call with each result
596177633Sdfr *	const int 		inittime;	-- how long to wait initially
597177633Sdfr *	const int 		waittime;	-- maximum time to wait
598177633Sdfr *	const char		*nettype;	-- Transport type
599177633Sdfr */
600177633Sdfr
601177633Sdfrtypedef bool_t (*resultproc_t)(caddr_t, ...);
602177633Sdfr
603177633Sdfr__BEGIN_DECLS
604177633Sdfrextern enum clnt_stat rpc_broadcast(const rpcprog_t, const rpcvers_t,
605177633Sdfr				    const rpcproc_t, const xdrproc_t,
606177633Sdfr				    caddr_t, const xdrproc_t, caddr_t,
607177633Sdfr				    const resultproc_t, const char *);
608177633Sdfrextern enum clnt_stat rpc_broadcast_exp(const rpcprog_t, const rpcvers_t,
609177633Sdfr					const rpcproc_t, const xdrproc_t,
610177633Sdfr					caddr_t, const xdrproc_t, caddr_t,
611177633Sdfr					const resultproc_t, const int,
612177633Sdfr					const int, const char *);
613177633Sdfr__END_DECLS
614177633Sdfr
615177633Sdfr#ifndef _KERNEL
616177633Sdfr/* For backward compatibility */
617177633Sdfr#include <rpc/clnt_soc.h>
618177633Sdfr#endif
619177633Sdfr
620177633Sdfr#endif /* !_RPC_CLNT_H_ */
621