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;