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