|
|
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: #ifndef lint ! 30: static char sccsid[] = "@(#)clnt_raw.c 1.4 85/03/17 Copyr 1984 Sun Micro"; ! 31: #endif ! 32: ! 33: /* ! 34: * clnt_raw.c ! 35: * ! 36: * Copyright (C) 1984, Sun Microsystems, Inc. ! 37: * ! 38: * Memory based rpc for simple testing and timing. ! 39: * Interface to create an rpc client and server in the same process. ! 40: * This lets us similate rpc and get round trip overhead, without ! 41: * any interference from the kernal. ! 42: */ ! 43: ! 44: #include "types.h" ! 45: #include <sys/time.h> ! 46: #include <netinet/in.h> ! 47: #include "xdr.h" ! 48: #include "auth.h" ! 49: #include "clnt.h" ! 50: #include "rpc_msg.h" ! 51: ! 52: #define NULL ((caddr_t)0) ! 53: #define MCALL_MSG_SIZE 24 ! 54: ! 55: /* ! 56: * This is the "network" we will be moving stuff over. ! 57: */ ! 58: char _raw_buf[UDPMSGSIZE]; ! 59: ! 60: static char mashl_callmsg[MCALL_MSG_SIZE]; ! 61: static u_int mcnt; ! 62: ! 63: static enum clnt_stat clntraw_call(); ! 64: static void clntraw_abort(); ! 65: static void clntraw_geterr(); ! 66: static bool_t clntraw_freeres(); ! 67: static void clntraw_destroy(); ! 68: ! 69: static struct clnt_ops client_ops = { ! 70: clntraw_call, ! 71: clntraw_abort, ! 72: clntraw_geterr, ! 73: clntraw_freeres, ! 74: clntraw_destroy ! 75: }; ! 76: ! 77: static CLIENT client_object; ! 78: static CLIENT *client = &client_object; ! 79: static XDR xdr_stream; ! 80: ! 81: void svc_getreq(); ! 82: ! 83: /* ! 84: * Create a client handle for memory based rpc. ! 85: */ ! 86: CLIENT * ! 87: clntraw_create(prog, vers) ! 88: u_long prog; ! 89: u_long vers; ! 90: { ! 91: struct rpc_msg call_msg; ! 92: XDR *xdrs = &xdr_stream; ! 93: ! 94: /* ! 95: * pre-serialize the staic part of the call msg and stash it away ! 96: */ ! 97: call_msg.rm_direction = CALL; ! 98: call_msg.rm_call.cb_rpcvers = RPC_MSG_VERSION; ! 99: call_msg.rm_call.cb_prog = prog; ! 100: call_msg.rm_call.cb_vers = vers; ! 101: xdrmem_create(xdrs, mashl_callmsg, MCALL_MSG_SIZE, XDR_ENCODE); ! 102: if (! xdr_callhdr(xdrs, &call_msg)) { ! 103: perror("clnt_raw.c - Fatal header serialization error."); ! 104: } ! 105: mcnt = XDR_GETPOS(xdrs); ! 106: XDR_DESTROY(xdrs); ! 107: ! 108: /* ! 109: * Set xdrmem for client/server shared buffer ! 110: */ ! 111: xdrmem_create(xdrs, _raw_buf, UDPMSGSIZE, XDR_FREE); ! 112: ! 113: /* ! 114: * create client handle ! 115: */ ! 116: client->cl_ops = &client_ops; ! 117: client->cl_auth = authnone_create(); ! 118: return (client); ! 119: } ! 120: ! 121: static enum clnt_stat ! 122: clntraw_call(h, proc, xargs, argsp, xresults, resultsp, timeout) ! 123: CLIENT *h; ! 124: u_long proc; ! 125: xdrproc_t xargs; ! 126: caddr_t argsp; ! 127: xdrproc_t xresults; ! 128: caddr_t resultsp; ! 129: struct timeval timeout; ! 130: { ! 131: register XDR *xdrs = &xdr_stream; ! 132: struct rpc_msg msg; ! 133: enum clnt_stat status; ! 134: struct rpc_err error; ! 135: ! 136: call_again: ! 137: /* ! 138: * send request ! 139: */ ! 140: xdrs->x_op = XDR_ENCODE; ! 141: XDR_SETPOS(xdrs, 0); ! 142: ((struct rpc_msg *)mashl_callmsg)->rm_xid ++ ; ! 143: if ((! XDR_PUTBYTES(xdrs, mashl_callmsg, mcnt)) || ! 144: (! XDR_PUTLONG(xdrs, (long *)&proc)) || ! 145: (! AUTH_MARSHALL(h->cl_auth, xdrs)) || ! 146: (! (*xargs)(xdrs, argsp))) { ! 147: return (RPC_CANTENCODEARGS); ! 148: } ! 149: (void)XDR_GETPOS(xdrs); /* called just to cause overhead */ ! 150: ! 151: /* ! 152: * We have to call server input routine here because this is ! 153: * all going on in one process. Yuk. ! 154: */ ! 155: svc_getreq(1); ! 156: ! 157: /* ! 158: * get results ! 159: */ ! 160: xdrs->x_op = XDR_DECODE; ! 161: XDR_SETPOS(xdrs, 0); ! 162: msg.acpted_rply.ar_verf = _null_auth; ! 163: msg.acpted_rply.ar_results.where = resultsp; ! 164: msg.acpted_rply.ar_results.proc = xresults; ! 165: if (! xdr_replymsg(xdrs, &msg)) ! 166: return (RPC_CANTDECODERES); ! 167: _seterr_reply(&msg, &error); ! 168: status = error.re_status; ! 169: ! 170: if (status == RPC_SUCCESS) { ! 171: if (! AUTH_VALIDATE(h->cl_auth, &msg.acpted_rply.ar_verf)) { ! 172: status = RPC_AUTHERROR; ! 173: } ! 174: } /* end successful completion */ ! 175: else { ! 176: if (AUTH_REFRESH(h->cl_auth)) ! 177: goto call_again; ! 178: } /* end of unsuccessful completion */ ! 179: ! 180: if (status == RPC_SUCCESS) { ! 181: if (! AUTH_VALIDATE(h->cl_auth, &msg.acpted_rply.ar_verf)) { ! 182: status = RPC_AUTHERROR; ! 183: } ! 184: if (msg.acpted_rply.ar_verf.oa_base != NULL) { ! 185: xdrs->x_op = XDR_FREE; ! 186: (void)xdr_opaque_auth(xdrs, &(msg.acpted_rply.ar_verf)); ! 187: } ! 188: } ! 189: ! 190: return (status); ! 191: } ! 192: ! 193: static void ! 194: clntraw_geterr() ! 195: { ! 196: } ! 197: ! 198: ! 199: static bool_t ! 200: clntraw_freeres(cl, xdr_res, res_ptr) ! 201: CLIENT *cl; ! 202: xdrproc_t xdr_res; ! 203: caddr_t res_ptr; ! 204: { ! 205: register XDR *xdrs = &xdr_stream; ! 206: ! 207: xdrs->x_op = XDR_FREE; ! 208: return ((*xdr_res)(xdrs, res_ptr)); ! 209: } ! 210: ! 211: static void ! 212: clntraw_abort() ! 213: { ! 214: } ! 215: ! 216: static void ! 217: clntraw_destroy() ! 218: { ! 219: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.