clnt.h revision 1903
178135Speter/*
278135Speter * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
378135Speter * unrestricted use provided that this legend is included on all tape
478135Speter * media and as a part of the software program in whole or part.  Users
578135Speter * may copy or modify Sun RPC without charge, but are not authorized
678135Speter * to license or distribute it to anyone else except as part of a product or
778135Speter * program developed by the user.
878135Speter *
978135Speter * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
1078135Speter * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
1178135Speter * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
1278135Speter *
1378135Speter * Sun RPC is provided with no support and without any obligation on the
1478135Speter * part of Sun Microsystems, Inc. to assist in its use, correction,
1578135Speter * modification or enhancement.
1678135Speter *
1778135Speter * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
1878135Speter * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
1978135Speter * OR ANY PART THEREOF.
2078135Speter *
2178135Speter * In no event will Sun Microsystems, Inc. be liable for any lost revenue
2278135Speter * or profits or other special, indirect and consequential damages, even if
2378135Speter * Sun has been advised of the possibility of such damages.
2478135Speter *
2578135Speter * Sun Microsystems, Inc.
2678135Speter * 2550 Garcia Avenue
27116182Sobrien * Mountain View, California  94043
28116182Sobrien *
29116182Sobrien *	from: @(#)clnt.h 1.31 88/02/08 SMI
3078135Speter *	from: @(#)clnt.h	2.1 88/07/29 4.0 RPCSRC
3194936Smux *	$Id: clnt.h,v 1.1 1993/10/27 05:40:18 paul Exp $
3294936Smux */
3378135Speter
3478135Speter/*
3578135Speter * clnt.h - Client side remote procedure call interface.
3678135Speter *
3778135Speter * Copyright (C) 1984, Sun Microsystems, Inc.
3878135Speter */
3978135Speter
4094936Smux#ifndef _RPC_CLNT_H_
4195593Speter#define _RPC_CLNT_H_
4279696Speter#include <sys/cdefs.h>
4378135Speter
4478135Speter/*
4578135Speter * Rpc calls return an enum clnt_stat.  This should be looked at more,
4678135Speter * since each implementation is required to live with this (implementation
4778135Speter * independent) list of errors.
4878135Speter */
4978135Speterenum clnt_stat {
5079696Speter	RPC_SUCCESS=0,			/* call succeeded */
5178135Speter	/*
5278135Speter	 * local errors
5378135Speter	 */
5478135Speter	RPC_CANTENCODEARGS=1,		/* can't encode arguments */
5595593Speter	RPC_CANTDECODERES=2,		/* can't decode results */
5678135Speter	RPC_CANTSEND=3,			/* failure in sending call */
5778135Speter	RPC_CANTRECV=4,			/* failure in receiving result */
5878135Speter	RPC_TIMEDOUT=5,			/* call timed out */
5978135Speter	/*
6079696Speter	 * remote errors
6178135Speter	 */
6278135Speter	RPC_VERSMISMATCH=6,		/* rpc versions not compatible */
6394936Smux	RPC_AUTHERROR=7,		/* authentication error */
6479696Speter	RPC_PROGUNAVAIL=8,		/* program not available */
6595839Speter	RPC_PROGVERSMISMATCH=9,		/* program version mismatched */
6679696Speter	RPC_PROCUNAVAIL=10,		/* procedure unavailable */
6779696Speter	RPC_CANTDECODEARGS=11,		/* decode arguments error */
6879696Speter	RPC_SYSTEMERROR=12,		/* generic "other problem" */
6994936Smux
7079696Speter	/*
7179696Speter	 * callrpc & clnt_create errors
7294936Smux	 */
7394936Smux	RPC_UNKNOWNHOST=13,		/* unknown host name */
7494936Smux	RPC_UNKNOWNPROTO=17,		/* unkown protocol */
7594936Smux
7694936Smux	/*
7794936Smux	 * _ create errors
7894936Smux	 */
7994936Smux	RPC_PMAPFAILURE=14,		/* the pmapper failed in its call */
8094936Smux	RPC_PROGNOTREGISTERED=15,	/* remote program is not registered */
8179696Speter	/*
8294936Smux	 * unspecified error
8394936Smux	 */
8494936Smux	RPC_FAILED=16
8594936Smux};
8694936Smux
8794936Smux
8894936Smux/*
8994936Smux * Error info.
9094936Smux */
9194936Smuxstruct rpc_err {
9294936Smux	enum clnt_stat re_status;
9379696Speter	union {
9494936Smux		int RE_errno;		/* realated system error */
9594936Smux		enum auth_stat RE_why;	/* why the auth error occurred */
9694936Smux		struct {
9794936Smux			u_long low;	/* lowest verion supported */
9894936Smux			u_long high;	/* highest verion supported */
9979696Speter		} RE_vers;
10079696Speter		struct {		/* maybe meaningful if RPC_FAILED */
10179696Speter			long s1;
10279696Speter			long s2;
10379696Speter		} RE_lb;		/* life boot & debugging only */
10479696Speter	} ru;
10594936Smux#define	re_errno	ru.RE_errno
10694936Smux#define	re_why		ru.RE_why
10794936Smux#define	re_vers		ru.RE_vers
10894936Smux#define	re_lb		ru.RE_lb
10994936Smux};
11094936Smux
11194936Smux
11279696Speter/*
11379696Speter * Client rpc handle.
11494936Smux * Created by individual implementations, see e.g. rpc_udp.c.
11594936Smux * Client is responsible for initializing auth, see e.g. auth_none.c.
11694936Smux */
11794936Smuxtypedef struct {
11894936Smux	AUTH	*cl_auth;			/* authenticator */
11994936Smux	struct clnt_ops {
12094936Smux		enum clnt_stat	(*cl_call)();	/* call remote procedure */
12194936Smux		void		(*cl_abort)();	/* abort a call */
12295839Speter		void		(*cl_geterr)();	/* get specific error code */
12394936Smux		bool_t		(*cl_freeres)(); /* frees results */
12478135Speter		void		(*cl_destroy)();/* destroy this structure */
12578135Speter		bool_t          (*cl_control)();/* the ioctl() of rpc */
12678135Speter	} *cl_ops;
12778135Speter	caddr_t			cl_private;	/* private stuff */
12878135Speter} CLIENT;
12978135Speter
13078135Speter
13178135Speter/*
13278135Speter * client side rpc interface ops
13378135Speter *
13478135Speter * Parameter types are:
13578135Speter *
13678135Speter */
13778135Speter
13878135Speter/*
13978135Speter * enum clnt_stat
14078135Speter * CLNT_CALL(rh, proc, xargs, argsp, xres, resp, timeout)
14178135Speter * 	CLIENT *rh;
14278135Speter *	u_long proc;
14378135Speter *	xdrproc_t xargs;
14478135Speter *	caddr_t argsp;
14578135Speter *	xdrproc_t xres;
14678135Speter *	caddr_t resp;
14778135Speter *	struct timeval timeout;
14878135Speter */
14978135Speter#define	CLNT_CALL(rh, proc, xargs, argsp, xres, resp, secs)	\
15078135Speter	((*(rh)->cl_ops->cl_call)(rh, proc, xargs, argsp, xres, resp, secs))
15195593Speter#define	clnt_call(rh, proc, xargs, argsp, xres, resp, secs)	\
15294936Smux	((*(rh)->cl_ops->cl_call)(rh, proc, xargs, argsp, xres, resp, secs))
15395593Speter
15495593Speter/*
15595593Speter * void
15695592Speter * CLNT_ABORT(rh);
15795592Speter * 	CLIENT *rh;
15878135Speter */
15995593Speter#define	CLNT_ABORT(rh)	((*(rh)->cl_ops->cl_abort)(rh))
16095593Speter#define	clnt_abort(rh)	((*(rh)->cl_ops->cl_abort)(rh))
16195593Speter
16295593Speter/*
16395592Speter * struct rpc_err
16478135Speter * CLNT_GETERR(rh);
16594936Smux * 	CLIENT *rh;
16694936Smux */
16778135Speter#define	CLNT_GETERR(rh,errp)	((*(rh)->cl_ops->cl_geterr)(rh, errp))
16878135Speter#define	clnt_geterr(rh,errp)	((*(rh)->cl_ops->cl_geterr)(rh, errp))
16978135Speter
17078135Speter
17178135Speter/*
17278135Speter * bool_t
17378135Speter * CLNT_FREERES(rh, xres, resp);
17478135Speter * 	CLIENT *rh;
17578135Speter *	xdrproc_t xres;
17678135Speter *	caddr_t resp;
177144077Sjhb */
17878135Speter#define	CLNT_FREERES(rh,xres,resp) ((*(rh)->cl_ops->cl_freeres)(rh,xres,resp))
17978135Speter#define	clnt_freeres(rh,xres,resp) ((*(rh)->cl_ops->cl_freeres)(rh,xres,resp))
18078135Speter
18178135Speter/*
18278135Speter * bool_t
18378135Speter * CLNT_CONTROL(cl, request, info)
18478135Speter *      CLIENT *cl;
185144077Sjhb *      u_int request;
18678135Speter *      char *info;
18778135Speter */
18878135Speter#define	CLNT_CONTROL(cl,rq,in) ((*(cl)->cl_ops->cl_control)(cl,rq,in))
18978135Speter#define	clnt_control(cl,rq,in) ((*(cl)->cl_ops->cl_control)(cl,rq,in))
19078135Speter
19178135Speter/*
19278135Speter * control operations that apply to both udp and tcp transports
19378135Speter */
19478135Speter#define CLSET_TIMEOUT       1   /* set timeout (timeval) */
19578135Speter#define CLGET_TIMEOUT       2   /* get timeout (timeval) */
19678135Speter#define CLGET_SERVER_ADDR   3   /* get server's address (sockaddr) */
19778135Speter/*
19878135Speter * udp only control operations
19978135Speter */
20078135Speter#define CLSET_RETRY_TIMEOUT 4   /* set retry timeout (timeval) */
20178135Speter#define CLGET_RETRY_TIMEOUT 5   /* get retry timeout (timeval) */
20278135Speter
20378135Speter/*
20478135Speter * void
20578135Speter * CLNT_DESTROY(rh);
20678135Speter * 	CLIENT *rh;
20778135Speter */
20878135Speter#define	CLNT_DESTROY(rh)	((*(rh)->cl_ops->cl_destroy)(rh))
20978135Speter#define	clnt_destroy(rh)	((*(rh)->cl_ops->cl_destroy)(rh))
21079696Speter
21178135Speter
21278135Speter/*
21378135Speter * RPCTEST is a test program which is accessable on every rpc
21478135Speter * transport/port.  It is used for testing, performance evaluation,
21578135Speter * and network administration.
21678135Speter */
21778135Speter
21878135Speter#define RPCTEST_PROGRAM		((u_long)1)
21979696Speter#define RPCTEST_VERSION		((u_long)1)
22078135Speter#define RPCTEST_NULL_PROC	((u_long)2)
22178135Speter#define RPCTEST_NULL_BATCH_PROC	((u_long)3)
22278135Speter
22378135Speter/*
22478135Speter * By convention, procedure 0 takes null arguments and returns them
22578135Speter */
22678135Speter
22778135Speter#define NULLPROC ((u_long)0)
22878135Speter
22978135Speter/*
23078135Speter * Below are the client handle creation routines for the various
23178135Speter * implementations of client side rpc.  They can return NULL if a
23278135Speter * creation failure occurs.
23378135Speter */
23478135Speter
23578135Speter/*
23678135Speter * Memory based rpc (for speed check and testing)
23778135Speter * CLIENT *
23878135Speter * clntraw_create(prog, vers)
23978135Speter *	u_long prog;
24078135Speter *	u_long vers;
24178135Speter */
24278135Speter__BEGIN_DECLS
24378135Speterextern CLIENT *clntraw_create	__P((u_long, u_long));
24478135Speter__END_DECLS
24578135Speter
24678135Speter
24778135Speter/*
24878135Speter * Generic client creation routine. Supported protocols are "udp" and "tcp"
24978135Speter * CLIENT *
25078135Speter * clnt_create(host, prog, vers, prot);
25178135Speter *	char *host; 	-- hostname
25278135Speter *	u_long prog;	-- program number
25378135Speter *	u_long vers;	-- version number
25478135Speter *	char *prot;	-- protocol
25578135Speter */
25678135Speter__BEGIN_DECLS
25778135Speterextern CLIENT *clnt_create	__P((char *, u_long, u_long, char *));
25878135Speter__END_DECLS
25978135Speter
26078135Speter
26178135Speter/*
26278135Speter * TCP based rpc
26378135Speter * CLIENT *
26478135Speter * clnttcp_create(raddr, prog, vers, sockp, sendsz, recvsz)
26578135Speter *	struct sockaddr_in *raddr;
26678135Speter *	u_long prog;
26778135Speter *	u_long version;
26878135Speter *	register int *sockp;
26978135Speter *	u_int sendsz;
27078135Speter *	u_int recvsz;
27178135Speter */
27278135Speter__BEGIN_DECLS
27378135Speterextern CLIENT *clnttcp_create	__P((struct sockaddr_in *,
27478135Speter				     u_long,
27578135Speter				     u_long,
27678135Speter				     int *,
27778135Speter				     u_int,
27878135Speter				     u_int));
27978135Speter__END_DECLS
28078135Speter
28178135Speter
28278135Speter/*
28378135Speter * UDP based rpc.
28478135Speter * CLIENT *
28578135Speter * clntudp_create(raddr, program, version, wait, sockp)
28678135Speter *	struct sockaddr_in *raddr;
28778135Speter *	u_long program;
28878135Speter *	u_long version;
28978135Speter *	struct timeval wait;
29078135Speter *	int *sockp;
29178135Speter *
29278135Speter * Same as above, but you specify max packet sizes.
29378135Speter * CLIENT *
29478135Speter * clntudp_bufcreate(raddr, program, version, wait, sockp, sendsz, recvsz)
29578135Speter *	struct sockaddr_in *raddr;
29678135Speter *	u_long program;
29778135Speter *	u_long version;
29878135Speter *	struct timeval wait;
29978135Speter *	int *sockp;
30078135Speter *	u_int sendsz;
30178135Speter *	u_int recvsz;
30278135Speter */
30378135Speter__BEGIN_DECLS
30478135Speterextern CLIENT *clntudp_create	__P((struct sockaddr_in *,
30578135Speter				     u_long,
30678135Speter				     u_long,
30778135Speter				     struct timeval,
30878135Speter				     int *));
30978135Speterextern CLIENT *clntudp_bufcreate __P((struct sockaddr_in *,
31078135Speter				     u_long,
31178135Speter				     u_long,
31278135Speter				     struct timeval,
31378135Speter				     int *,
31478135Speter				     u_int,
315143386Sjmg				     u_int));
31678135Speter__END_DECLS
31778135Speter
31878135Speter
31978135Speter/*
32078135Speter * Print why creation failed
32178135Speter */
32278135Speter__BEGIN_DECLS
32378135Speterextern void clnt_pcreateerror	__P((char *));			/* stderr */
32478135Speterextern char *clnt_spcreateerror	__P((char *));			/* string */
32578135Speter__END_DECLS
32678135Speter
32778135Speter/*
32878135Speter * Like clnt_perror(), but is more verbose in its output
32978135Speter */
33078135Speter__BEGIN_DECLS
33178135Speterextern void clnt_perrno		__P((enum clnt_stat));		/* stderr */
33278135Speterextern char *clnt_sperrno	__P((enum clnt_stat));		/* string */
33378135Speter__END_DECLS
33478135Speter
33578135Speter/*
33678135Speter * Print an English error message, given the client error code
33778135Speter */
33878135Speter__BEGIN_DECLS
33978135Speterextern void clnt_perror		__P((CLIENT *, char *)); 	/* stderr */
34078135Speterextern char *clnt_sperror	__P((CLIENT *, char *));	/* string */
34178135Speter__END_DECLS
34278135Speter
34378135Speter
34478135Speter/*
34578135Speter * If a creation fails, the following allows the user to figure out why.
34678135Speter */
34778135Speterstruct rpc_createerr {
34878135Speter	enum clnt_stat cf_stat;
34978135Speter	struct rpc_err cf_error; /* useful when cf_stat == RPC_PMAPFAILURE */
35078135Speter};
35178135Speter
35278135Speterextern struct rpc_createerr rpc_createerr;
35378135Speter
35478135Speter
35578135Speter#define UDPMSGSIZE	8800	/* rpc imposed limit on udp msg size */
35678135Speter#define RPCSMALLMSGSIZE	400	/* a more reasonable packet size */
35778135Speter
35878135Speter#endif /* !_RPC_CLNT_H */
35978135Speter