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