|
|
1.1 ! root 1: /* ! 2: * Sun RPC is a product of Sun Microsystems, Inc. and is provided for ! 3: * unrestricted use provided that this legend is included on all tape ! 4: * media and as a part of the software program in whole or part. Users ! 5: * may copy or modify Sun RPC without charge, but are not authorized ! 6: * to license or distribute it to anyone else except as part of a product or ! 7: * program developed by the user. ! 8: * ! 9: * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE ! 10: * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR ! 11: * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. ! 12: * ! 13: * Sun RPC is provided with no support and without any obligation on the ! 14: * part of Sun Microsystems, Inc. to assist in its use, correction, ! 15: * modification or enhancement. ! 16: * ! 17: * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE ! 18: * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC ! 19: * OR ANY PART THEREOF. ! 20: * ! 21: * In no event will Sun Microsystems, Inc. be liable for any lost revenue ! 22: * or profits or other special, indirect and consequential damages, even if ! 23: * Sun has been advised of the possibility of such damages. ! 24: * ! 25: * Sun Microsystems, Inc. ! 26: * 2550 Garcia Avenue ! 27: * Mountain View, California 94043 ! 28: */ ! 29: /* @(#)clnt.h 1.3 85/03/20 SMI */ ! 30: ! 31: /* ! 32: * clnt.h - Client side remote procedure call interface. ! 33: * ! 34: * Copyright (C) 1984, Sun Microsystems, Inc. ! 35: */ ! 36: ! 37: /* ! 38: * Rpc calls return an enum clnt_stat. This should be looked at more, ! 39: * since each implementation is required to live with this (implementation ! 40: * independent) list of errors. ! 41: */ ! 42: enum clnt_stat { ! 43: RPC_SUCCESS=0, /* call succeeded */ ! 44: /* ! 45: * local errors ! 46: */ ! 47: RPC_CANTENCODEARGS=1, /* can't encode arguments */ ! 48: RPC_CANTDECODERES=2, /* can't decode results */ ! 49: RPC_CANTSEND=3, /* failure in sending call */ ! 50: RPC_CANTRECV=4, /* failure in receiving result */ ! 51: RPC_TIMEDOUT=5, /* call timed out */ ! 52: /* ! 53: * remote errors ! 54: */ ! 55: RPC_VERSMISMATCH=6, /* rpc versions not compatible */ ! 56: RPC_AUTHERROR=7, /* authentication error */ ! 57: RPC_PROGUNAVAIL=8, /* program not available */ ! 58: RPC_PROGVERSMISMATCH=9, /* program version mismatched */ ! 59: RPC_PROCUNAVAIL=10, /* procedure unavailable */ ! 60: RPC_CANTDECODEARGS=11, /* decode arguments error */ ! 61: RPC_SYSTEMERROR=12, /* generic "other problem" */ ! 62: ! 63: /* ! 64: * callrpc errors ! 65: */ ! 66: RPC_UNKNOWNHOST=13, /* unknown host name */ ! 67: ! 68: /* ! 69: * _ create errors ! 70: */ ! 71: RPC_PMAPFAILURE=14, /* the pmapper failed in its call */ ! 72: RPC_PROGNOTREGISTERED=15, /* remote program is not registered */ ! 73: /* ! 74: * unspecified error ! 75: */ ! 76: RPC_FAILED=16 ! 77: }; ! 78: ! 79: ! 80: /* ! 81: * Error info. ! 82: */ ! 83: struct rpc_err { ! 84: enum clnt_stat re_status; ! 85: union { ! 86: int RE_errno; /* realated system error */ ! 87: enum auth_stat RE_why; /* why the auth error occurred */ ! 88: struct { ! 89: u_long low; /* lowest verion supported */ ! 90: u_long high; /* highest verion supported */ ! 91: } RE_vers; ! 92: struct { /* maybe meaningful if RPC_FAILED */ ! 93: long s1; ! 94: long s2; ! 95: } RE_lb; /* life boot & debugging only */ ! 96: } ru; ! 97: #define re_errno ru.RE_errno ! 98: #define re_why ru.RE_why ! 99: #define re_vers ru.RE_vers ! 100: #define re_lb ru.RE_lb ! 101: }; ! 102: ! 103: ! 104: /* ! 105: * Client rpc handle. ! 106: * Created by individual implementations, see e.g. rpc_udp.c. ! 107: * Client is responsible for initializing auth, see e.g. auth_none.c. ! 108: */ ! 109: typedef struct { ! 110: AUTH *cl_auth; /* authenticator */ ! 111: struct clnt_ops { ! 112: enum clnt_stat (*cl_call)(); /* call remote procedure */ ! 113: void (*cl_abort)(); /* abort a call */ ! 114: void (*cl_geterr)(); /* get specific error code */ ! 115: bool_t (*cl_freeres)(); /* frees results */ ! 116: void (*cl_destroy)();/* destroy this structure */ ! 117: } *cl_ops; ! 118: caddr_t cl_private; /* private stuff */ ! 119: } CLIENT; ! 120: ! 121: ! 122: /* ! 123: * client side rpc interface ops ! 124: * ! 125: * Parameter types are: ! 126: * ! 127: */ ! 128: ! 129: /* ! 130: * enum clnt_stat ! 131: * CLNT_CALL(rh, proc, xargs, argsp, xres, resp, timeout) ! 132: * CLIENT *rh; ! 133: * u_long proc; ! 134: * xdrproc_t xargs; ! 135: * caddr_t argsp; ! 136: * xdrproc_t xres; ! 137: * caddr_t resp; ! 138: * struct timeval timeout; ! 139: */ ! 140: #define CLNT_CALL(rh, proc, xargs, argsp, xres, resp, secs) \ ! 141: ((*(rh)->cl_ops->cl_call)(rh, proc, xargs, argsp, xres, resp, secs)) ! 142: #define clnt_call(rh, proc, xargs, argsp, xres, resp, secs) \ ! 143: ((*(rh)->cl_ops->cl_call)(rh, proc, xargs, argsp, xres, resp, secs)) ! 144: ! 145: /* ! 146: * void ! 147: * CLNT_ABORT(rh); ! 148: * CLIENT *rh; ! 149: */ ! 150: #define CLNT_ABORT(rh) ((*(rh)->cl_ops->cl_abort)(rh)) ! 151: #define clnt_abort(rh) ((*(rh)->cl_ops->cl_abort)(rh)) ! 152: ! 153: /* ! 154: * struct rpc_err ! 155: * CLNT_GETERR(rh); ! 156: * CLIENT *rh; ! 157: */ ! 158: #define CLNT_GETERR(rh,errp) ((*(rh)->cl_ops->cl_geterr)(rh, errp)) ! 159: #define clnt_geterr(rh,errp) ((*(rh)->cl_ops->cl_geterr)(rh, errp)) ! 160: ! 161: ! 162: /* ! 163: * bool_t ! 164: * CLNT_FREERES(rh, xres, resp); ! 165: * CLIENT *rh; ! 166: * xdrproc_t xres; ! 167: * caddr_t resp; ! 168: */ ! 169: #define CLNT_FREERES(rh,xres,resp) ((*(rh)->cl_ops->cl_freeres)(rh,xres,resp)) ! 170: #define clnt_freeres(rh,xres,resp) ((*(rh)->cl_ops->cl_freeres)(rh,xres,resp)) ! 171: ! 172: /* ! 173: * void ! 174: * CLNT_DESTROY(rh); ! 175: * CLIENT *rh; ! 176: */ ! 177: #define CLNT_DESTROY(rh) ((*(rh)->cl_ops->cl_destroy)(rh)) ! 178: #define clnt_destroy(rh) ((*(rh)->cl_ops->cl_destroy)(rh)) ! 179: ! 180: ! 181: /* ! 182: * RPCTEST is a test program which is accessable on every rpc ! 183: * transport/port. It is used for testing, performance evaluation, ! 184: * and network administration. ! 185: */ ! 186: ! 187: #define RPCTEST_PROGRAM ((u_long)1) ! 188: #define RPCTEST_VERSION ((u_long)1) ! 189: #define RPCTEST_NULL_PROC ((u_long)2) ! 190: #define RPCTEST_NULL_BATCH_PROC ((u_long)3) ! 191: ! 192: /* ! 193: * By convention, procedure 0 takes null arguments and returns them ! 194: */ ! 195: ! 196: #define NULLPROC ((u_long)0) ! 197: ! 198: /* ! 199: * Below are the client handle creation routines for the various ! 200: * implementations of client side rpc. They can return NULL if a ! 201: * creation failure occurs. ! 202: */ ! 203: ! 204: /* ! 205: * Memory based rpc (for speed check and testing) ! 206: * CLIENT * ! 207: * clntraw_create(prog, vers) ! 208: * u_long prog; ! 209: * u_long vers; ! 210: */ ! 211: extern CLIENT *clntraw_create(); ! 212: ! 213: /* ! 214: * UDP based rpc. ! 215: * CLIENT * ! 216: * clntudp_create(raddr, program, version, wait, sockp) ! 217: * struct sockaddr_in *raddr; ! 218: * u_long program; ! 219: * u_long version; ! 220: * struct timeval wait; ! 221: * int *sockp; ! 222: */ ! 223: extern CLIENT *clntudp_create(); ! 224: #define UDPMSGSIZE 8800 ! 225: ! 226: /* ! 227: * TCP based rpc ! 228: * CLIENT * ! 229: * clnttcp_create(raddr, prog, vers, sockp, sendsz, recvsz) ! 230: * struct sockaddr_in *raddr; ! 231: * u_long prog; ! 232: * u_long version; ! 233: * register int *sockp; ! 234: * u_int sendsz; ! 235: * u_int recvsz; ! 236: */ ! 237: extern CLIENT *clnttcp_create(); ! 238: ! 239: ! 240: /* ! 241: * If a creation fails, the following allows the user to figure out why. ! 242: */ ! 243: struct rpc_createerr { ! 244: enum clnt_stat cf_stat; ! 245: struct rpc_err cf_error; /* useful when cf_stat == RPC_PMAPFAILURE */ ! 246: }; ! 247: ! 248: extern struct rpc_createerr rpc_createerr; ! 249:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.