1*10465441SEvalZero /* 2*10465441SEvalZero * Copyright (c) 2006-2018, RT-Thread Development Team 3*10465441SEvalZero * 4*10465441SEvalZero * SPDX-License-Identifier: Apache-2.0 5*10465441SEvalZero * 6*10465441SEvalZero * Change Logs: 7*10465441SEvalZero * Date Author Notes 8*10465441SEvalZero */ 9*10465441SEvalZero /* @(#)clnt.h 2.1 88/07/29 4.0 RPCSRC; from 1.31 88/02/08 SMI*/ 10*10465441SEvalZero /* 11*10465441SEvalZero * Sun RPC is a product of Sun Microsystems, Inc. and is provided for 12*10465441SEvalZero * unrestricted use provided that this legend is included on all tape 13*10465441SEvalZero * media and as a part of the software program in whole or part. Users 14*10465441SEvalZero * may copy or modify Sun RPC without charge, but are not authorized 15*10465441SEvalZero * to license or distribute it to anyone else except as part of a product or 16*10465441SEvalZero * program developed by the user. 17*10465441SEvalZero * 18*10465441SEvalZero * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE 19*10465441SEvalZero * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR 20*10465441SEvalZero * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. 21*10465441SEvalZero * 22*10465441SEvalZero * Sun RPC is provided with no support and without any obligation on the 23*10465441SEvalZero * part of Sun Microsystems, Inc. to assist in its use, correction, 24*10465441SEvalZero * modification or enhancement. 25*10465441SEvalZero * 26*10465441SEvalZero * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE 27*10465441SEvalZero * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC 28*10465441SEvalZero * OR ANY PART THEREOF. 29*10465441SEvalZero * 30*10465441SEvalZero * In no event will Sun Microsystems, Inc. be liable for any lost revenue 31*10465441SEvalZero * or profits or other special, indirect and consequential damages, even if 32*10465441SEvalZero * Sun has been advised of the possibility of such damages. 33*10465441SEvalZero * 34*10465441SEvalZero * Sun Microsystems, Inc. 35*10465441SEvalZero * 2550 Garcia Avenue 36*10465441SEvalZero * Mountain View, California 94043 37*10465441SEvalZero */ 38*10465441SEvalZero 39*10465441SEvalZero /* 40*10465441SEvalZero * clnt.h - Client side remote procedure call interface. 41*10465441SEvalZero * 42*10465441SEvalZero * Copyright (C) 1984, Sun Microsystems, Inc. 43*10465441SEvalZero */ 44*10465441SEvalZero 45*10465441SEvalZero #ifndef _RPC_CLNT_H 46*10465441SEvalZero #define _RPC_CLNT_H 1 47*10465441SEvalZero 48*10465441SEvalZero #include <rpc/types.h> 49*10465441SEvalZero #include <rpc/auth.h> 50*10465441SEvalZero #include <lwip/sockets.h> 51*10465441SEvalZero 52*10465441SEvalZero /* 53*10465441SEvalZero * Rpc calls return an enum clnt_stat. This should be looked at more, 54*10465441SEvalZero * since each implementation is required to live with this (implementation 55*10465441SEvalZero * independent) list of errors. 56*10465441SEvalZero */ 57*10465441SEvalZero enum clnt_stat { 58*10465441SEvalZero RPC_SUCCESS=0, /* call succeeded */ 59*10465441SEvalZero /* 60*10465441SEvalZero * local errors 61*10465441SEvalZero */ 62*10465441SEvalZero RPC_CANTENCODEARGS=1, /* can't encode arguments */ 63*10465441SEvalZero RPC_CANTDECODERES=2, /* can't decode results */ 64*10465441SEvalZero RPC_CANTSEND=3, /* failure in sending call */ 65*10465441SEvalZero RPC_CANTRECV=4, /* failure in receiving result */ 66*10465441SEvalZero RPC_TIMEDOUT=5, /* call timed out */ 67*10465441SEvalZero /* 68*10465441SEvalZero * remote errors 69*10465441SEvalZero */ 70*10465441SEvalZero RPC_VERSMISMATCH=6, /* rpc versions not compatible */ 71*10465441SEvalZero RPC_AUTHERROR=7, /* authentication error */ 72*10465441SEvalZero RPC_PROGUNAVAIL=8, /* program not available */ 73*10465441SEvalZero RPC_PROGVERSMISMATCH=9, /* program version mismatched */ 74*10465441SEvalZero RPC_PROCUNAVAIL=10, /* procedure unavailable */ 75*10465441SEvalZero RPC_CANTDECODEARGS=11, /* decode arguments error */ 76*10465441SEvalZero RPC_SYSTEMERROR=12, /* generic "other problem" */ 77*10465441SEvalZero RPC_NOBROADCAST = 21, /* Broadcasting not supported */ 78*10465441SEvalZero /* 79*10465441SEvalZero * callrpc & clnt_create errors 80*10465441SEvalZero */ 81*10465441SEvalZero RPC_UNKNOWNHOST=13, /* unknown host name */ 82*10465441SEvalZero RPC_UNKNOWNPROTO=17, /* unknown protocol */ 83*10465441SEvalZero RPC_UNKNOWNADDR = 19, /* Remote address unknown */ 84*10465441SEvalZero 85*10465441SEvalZero /* 86*10465441SEvalZero * rpcbind errors 87*10465441SEvalZero */ 88*10465441SEvalZero RPC_RPCBFAILURE=14, /* portmapper failed in its call */ 89*10465441SEvalZero #define RPC_PMAPFAILURE RPC_RPCBFAILURE 90*10465441SEvalZero RPC_PROGNOTREGISTERED=15, /* remote program is not registered */ 91*10465441SEvalZero RPC_N2AXLATEFAILURE = 22, /* Name to addr translation failed */ 92*10465441SEvalZero /* 93*10465441SEvalZero * unspecified error 94*10465441SEvalZero */ 95*10465441SEvalZero RPC_FAILED=16, 96*10465441SEvalZero RPC_INTR=18, 97*10465441SEvalZero RPC_TLIERROR=20, 98*10465441SEvalZero RPC_UDERROR=23, 99*10465441SEvalZero /* 100*10465441SEvalZero * asynchronous errors 101*10465441SEvalZero */ 102*10465441SEvalZero RPC_INPROGRESS = 24, 103*10465441SEvalZero RPC_STALERACHANDLE = 25 104*10465441SEvalZero }; 105*10465441SEvalZero 106*10465441SEvalZero 107*10465441SEvalZero /* 108*10465441SEvalZero * Error info. 109*10465441SEvalZero */ 110*10465441SEvalZero struct rpc_err { 111*10465441SEvalZero int re_status; 112*10465441SEvalZero union { 113*10465441SEvalZero int RE_errno; /* related system error */ 114*10465441SEvalZero int RE_why; /* why the auth error occurred */ 115*10465441SEvalZero struct { 116*10465441SEvalZero unsigned long low; /* lowest verion supported */ 117*10465441SEvalZero unsigned long high; /* highest verion supported */ 118*10465441SEvalZero } RE_vers; 119*10465441SEvalZero struct { /* maybe meaningful if RPC_FAILED */ 120*10465441SEvalZero long s1; 121*10465441SEvalZero long s2; 122*10465441SEvalZero } RE_lb; /* life boot & debugging only */ 123*10465441SEvalZero } ru; 124*10465441SEvalZero #define re_errno ru.RE_errno 125*10465441SEvalZero #define re_why ru.RE_why 126*10465441SEvalZero #define re_vers ru.RE_vers 127*10465441SEvalZero #define re_lb ru.RE_lb 128*10465441SEvalZero }; 129*10465441SEvalZero 130*10465441SEvalZero 131*10465441SEvalZero /* 132*10465441SEvalZero * Client rpc handle. 133*10465441SEvalZero * Created by individual implementations, see e.g. rpc_udp.c. 134*10465441SEvalZero * Client is responsible for initializing auth, see e.g. auth_none.c. 135*10465441SEvalZero */ 136*10465441SEvalZero typedef struct CLIENT CLIENT; 137*10465441SEvalZero struct CLIENT { 138*10465441SEvalZero AUTH *cl_auth; /* authenticator */ 139*10465441SEvalZero struct clnt_ops { 140*10465441SEvalZero enum clnt_stat (*cl_call) (CLIENT *, unsigned long, xdrproc_t, char*, xdrproc_t, 141*10465441SEvalZero char*, struct timeval); 142*10465441SEvalZero /* call remote procedure */ 143*10465441SEvalZero void (*cl_abort) (void); /* abort a call */ 144*10465441SEvalZero void (*cl_geterr) (CLIENT *, struct rpc_err *); 145*10465441SEvalZero /* get specific error code */ 146*10465441SEvalZero bool_t (*cl_freeres) (CLIENT *, xdrproc_t, char*); 147*10465441SEvalZero /* frees results */ 148*10465441SEvalZero void (*cl_destroy) (CLIENT *); /* destroy this structure */ 149*10465441SEvalZero bool_t (*cl_control) (CLIENT *, int, char *); 150*10465441SEvalZero /* the ioctl() of rpc */ 151*10465441SEvalZero } *cl_ops; 152*10465441SEvalZero char* cl_private; /* private stuff */ 153*10465441SEvalZero }; 154*10465441SEvalZero 155*10465441SEvalZero 156*10465441SEvalZero /* 157*10465441SEvalZero * client side rpc interface ops 158*10465441SEvalZero * 159*10465441SEvalZero * Parameter types are: 160*10465441SEvalZero * 161*10465441SEvalZero */ 162*10465441SEvalZero 163*10465441SEvalZero /* 164*10465441SEvalZero * enum clnt_stat 165*10465441SEvalZero * CLNT_CALL(rh, proc, xargs, argsp, xres, resp, timeout) 166*10465441SEvalZero * CLIENT *rh; 167*10465441SEvalZero * unsigned long proc; 168*10465441SEvalZero * xdrproc_t xargs; 169*10465441SEvalZero * char* argsp; 170*10465441SEvalZero * xdrproc_t xres; 171*10465441SEvalZero * char* resp; 172*10465441SEvalZero * struct timeval timeout; 173*10465441SEvalZero */ 174*10465441SEvalZero #define CLNT_CALL(rh, proc, xargs, argsp, xres, resp, secs) \ 175*10465441SEvalZero ((*(rh)->cl_ops->cl_call)(rh, proc, xargs, argsp, xres, resp, secs)) 176*10465441SEvalZero #define clnt_call(rh, proc, xargs, argsp, xres, resp, secs) \ 177*10465441SEvalZero ((*(rh)->cl_ops->cl_call)(rh, proc, xargs, argsp, xres, resp, secs)) 178*10465441SEvalZero 179*10465441SEvalZero /* 180*10465441SEvalZero * void 181*10465441SEvalZero * CLNT_ABORT(rh); 182*10465441SEvalZero * CLIENT *rh; 183*10465441SEvalZero */ 184*10465441SEvalZero #define CLNT_ABORT(rh) ((*(rh)->cl_ops->cl_abort)(rh)) 185*10465441SEvalZero #define clnt_abort(rh) ((*(rh)->cl_ops->cl_abort)(rh)) 186*10465441SEvalZero 187*10465441SEvalZero /* 188*10465441SEvalZero * struct rpc_err 189*10465441SEvalZero * CLNT_GETERR(rh); 190*10465441SEvalZero * CLIENT *rh; 191*10465441SEvalZero */ 192*10465441SEvalZero #define CLNT_GETERR(rh,errp) ((*(rh)->cl_ops->cl_geterr)(rh, errp)) 193*10465441SEvalZero #define clnt_geterr(rh,errp) ((*(rh)->cl_ops->cl_geterr)(rh, errp)) 194*10465441SEvalZero 195*10465441SEvalZero 196*10465441SEvalZero /* 197*10465441SEvalZero * bool_t 198*10465441SEvalZero * CLNT_FREERES(rh, xres, resp); 199*10465441SEvalZero * CLIENT *rh; 200*10465441SEvalZero * xdrproc_t xres; 201*10465441SEvalZero * char* resp; 202*10465441SEvalZero */ 203*10465441SEvalZero #define CLNT_FREERES(rh,xres,resp) ((*(rh)->cl_ops->cl_freeres)(rh,xres,resp)) 204*10465441SEvalZero #define clnt_freeres(rh,xres,resp) ((*(rh)->cl_ops->cl_freeres)(rh,xres,resp)) 205*10465441SEvalZero 206*10465441SEvalZero /* 207*10465441SEvalZero * bool_t 208*10465441SEvalZero * CLNT_CONTROL(cl, request, info) 209*10465441SEvalZero * CLIENT *cl; 210*10465441SEvalZero * unsigned int request; 211*10465441SEvalZero * char *info; 212*10465441SEvalZero */ 213*10465441SEvalZero #define CLNT_CONTROL(cl,rq,in) ((*(cl)->cl_ops->cl_control)(cl,rq,in)) 214*10465441SEvalZero #define clnt_control(cl,rq,in) ((*(cl)->cl_ops->cl_control)(cl,rq,in)) 215*10465441SEvalZero 216*10465441SEvalZero /* 217*10465441SEvalZero * control operations that apply to all transports 218*10465441SEvalZero * 219*10465441SEvalZero * Note: options marked XXX are no-ops in this implementation of RPC. 220*10465441SEvalZero * The are present in TI-RPC but can't be implemented here since they 221*10465441SEvalZero * depend on the presence of STREAMS/TLI, which we don't have. 222*10465441SEvalZero */ 223*10465441SEvalZero #define CLSET_TIMEOUT 1 /* set timeout (timeval) */ 224*10465441SEvalZero #define CLGET_TIMEOUT 2 /* get timeout (timeval) */ 225*10465441SEvalZero #define CLGET_SERVER_ADDR 3 /* get server's address (sockaddr) */ 226*10465441SEvalZero #define CLGET_FD 6 /* get connections file descriptor */ 227*10465441SEvalZero #define CLGET_SVC_ADDR 7 /* get server's address (netbuf) XXX */ 228*10465441SEvalZero #define CLSET_FD_CLOSE 8 /* close fd while clnt_destroy */ 229*10465441SEvalZero #define CLSET_FD_NCLOSE 9 /* Do not close fd while clnt_destroy*/ 230*10465441SEvalZero #define CLGET_XID 10 /* Get xid */ 231*10465441SEvalZero #define CLSET_XID 11 /* Set xid */ 232*10465441SEvalZero #define CLGET_VERS 12 /* Get version number */ 233*10465441SEvalZero #define CLSET_VERS 13 /* Set version number */ 234*10465441SEvalZero #define CLGET_PROG 14 /* Get program number */ 235*10465441SEvalZero #define CLSET_PROG 15 /* Set program number */ 236*10465441SEvalZero #define CLSET_SVC_ADDR 16 /* get server's address (netbuf) XXX */ 237*10465441SEvalZero #define CLSET_PUSH_TIMOD 17 /* push timod if not already present XXX */ 238*10465441SEvalZero #define CLSET_POP_TIMOD 18 /* pop timod XXX */ 239*10465441SEvalZero /* 240*10465441SEvalZero * Connectionless only control operations 241*10465441SEvalZero */ 242*10465441SEvalZero #define CLSET_RETRY_TIMEOUT 4 /* set retry timeout (timeval) */ 243*10465441SEvalZero #define CLGET_RETRY_TIMEOUT 5 /* get retry timeout (timeval) */ 244*10465441SEvalZero 245*10465441SEvalZero /* 246*10465441SEvalZero * void 247*10465441SEvalZero * CLNT_DESTROY(rh); 248*10465441SEvalZero * CLIENT *rh; 249*10465441SEvalZero */ 250*10465441SEvalZero #define CLNT_DESTROY(rh) ((*(rh)->cl_ops->cl_destroy)(rh)) 251*10465441SEvalZero #define clnt_destroy(rh) ((*(rh)->cl_ops->cl_destroy)(rh)) 252*10465441SEvalZero 253*10465441SEvalZero 254*10465441SEvalZero /* 255*10465441SEvalZero * RPCTEST is a test program which is accessible on every rpc 256*10465441SEvalZero * transport/port. It is used for testing, performance evaluation, 257*10465441SEvalZero * and network administration. 258*10465441SEvalZero */ 259*10465441SEvalZero 260*10465441SEvalZero #define RPCTEST_PROGRAM ((unsigned long)1) 261*10465441SEvalZero #define RPCTEST_VERSION ((unsigned long)1) 262*10465441SEvalZero #define RPCTEST_NULL_PROC ((unsigned long)2) 263*10465441SEvalZero #define RPCTEST_NULL_BATCH_PROC ((unsigned long)3) 264*10465441SEvalZero 265*10465441SEvalZero /* 266*10465441SEvalZero * By convention, procedure 0 takes null arguments and returns them 267*10465441SEvalZero */ 268*10465441SEvalZero 269*10465441SEvalZero #define NULLPROC ((unsigned long)0) 270*10465441SEvalZero 271*10465441SEvalZero /* 272*10465441SEvalZero * Below are the client handle creation routines for the various 273*10465441SEvalZero * implementations of client side rpc. They can return NULL if a 274*10465441SEvalZero * creation failure occurs. 275*10465441SEvalZero */ 276*10465441SEvalZero 277*10465441SEvalZero /* 278*10465441SEvalZero * Generic client creation routine. Supported protocols are "udp", "tcp" and 279*10465441SEvalZero * "unix" 280*10465441SEvalZero * CLIENT * 281*10465441SEvalZero * clnt_create(host, prog, vers, prot) 282*10465441SEvalZero * char *host; -- hostname 283*10465441SEvalZero * unsigned long prog; -- program number 284*10465441SEvalZero * u_ong vers; -- version number 285*10465441SEvalZero * char *prot; -- protocol 286*10465441SEvalZero */ 287*10465441SEvalZero extern CLIENT *clnt_create (const char *__host, const unsigned long __prog, 288*10465441SEvalZero const unsigned long __vers, const char *__prot) 289*10465441SEvalZero ; 290*10465441SEvalZero 291*10465441SEvalZero /* 292*10465441SEvalZero * UDP based rpc. 293*10465441SEvalZero * CLIENT * 294*10465441SEvalZero * clntudp_create(raddr, program, version, wait, sockp) 295*10465441SEvalZero * struct sockaddr_in *raddr; 296*10465441SEvalZero * unsigned long program; 297*10465441SEvalZero * unsigned long version; 298*10465441SEvalZero * struct timeval wait_resend; 299*10465441SEvalZero * int *sockp; 300*10465441SEvalZero * 301*10465441SEvalZero * Same as above, but you specify max packet sizes. 302*10465441SEvalZero * CLIENT * 303*10465441SEvalZero * clntudp_bufcreate(raddr, program, version, wait, sockp, sendsz, recvsz) 304*10465441SEvalZero * struct sockaddr_in *raddr; 305*10465441SEvalZero * unsigned long program; 306*10465441SEvalZero * unsigned long version; 307*10465441SEvalZero * struct timeval wait_resend; 308*10465441SEvalZero * int *sockp; 309*10465441SEvalZero * unsigned int sendsz; 310*10465441SEvalZero * unsigned int recvsz; 311*10465441SEvalZero */ 312*10465441SEvalZero extern CLIENT *clntudp_create (struct sockaddr_in *__raddr, unsigned long __program, 313*10465441SEvalZero unsigned long __version, struct timeval __wait_resend, 314*10465441SEvalZero int *__sockp); 315*10465441SEvalZero extern CLIENT *clntudp_bufcreate (struct sockaddr_in *__raddr, 316*10465441SEvalZero unsigned long __program, unsigned long __version, 317*10465441SEvalZero struct timeval __wait_resend, int *__sockp, 318*10465441SEvalZero unsigned int __sendsz, unsigned int __recvsz); 319*10465441SEvalZero 320*10465441SEvalZero extern int callrpc (const char *__host, const unsigned long __prognum, 321*10465441SEvalZero const unsigned long __versnum, const unsigned long __procnum, 322*10465441SEvalZero const xdrproc_t __inproc, const char *__in, 323*10465441SEvalZero const xdrproc_t __outproc, char *__out); 324*10465441SEvalZero 325*10465441SEvalZero #define UDPMSGSIZE 8800 /* rpc imposed limit on udp msg size */ 326*10465441SEvalZero #define RPCSMALLMSGSIZE 400 /* a more reasonable packet size */ 327*10465441SEvalZero 328*10465441SEvalZero void clnt_perror(CLIENT *rpch, const char *s); 329*10465441SEvalZero 330*10465441SEvalZero #endif /* rpc/clnt.h */ 331