1*45091Smckusick /* @(#)svc_raw.c 2.1 88/07/29 4.0 RPCSRC */
2*45091Smckusick /*
3*45091Smckusick * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
4*45091Smckusick * unrestricted use provided that this legend is included on all tape
5*45091Smckusick * media and as a part of the software program in whole or part. Users
6*45091Smckusick * may copy or modify Sun RPC without charge, but are not authorized
7*45091Smckusick * to license or distribute it to anyone else except as part of a product or
8*45091Smckusick * program developed by the user.
9*45091Smckusick *
10*45091Smckusick * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
11*45091Smckusick * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
12*45091Smckusick * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
13*45091Smckusick *
14*45091Smckusick * Sun RPC is provided with no support and without any obligation on the
15*45091Smckusick * part of Sun Microsystems, Inc. to assist in its use, correction,
16*45091Smckusick * modification or enhancement.
17*45091Smckusick *
18*45091Smckusick * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
19*45091Smckusick * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
20*45091Smckusick * OR ANY PART THEREOF.
21*45091Smckusick *
22*45091Smckusick * In no event will Sun Microsystems, Inc. be liable for any lost revenue
23*45091Smckusick * or profits or other special, indirect and consequential damages, even if
24*45091Smckusick * Sun has been advised of the possibility of such damages.
25*45091Smckusick *
26*45091Smckusick * Sun Microsystems, Inc.
27*45091Smckusick * 2550 Garcia Avenue
28*45091Smckusick * Mountain View, California 94043
29*45091Smckusick */
30*45091Smckusick #if !defined(lint) && defined(SCCSIDS)
31*45091Smckusick static char sccsid[] = "@(#)svc_raw.c 1.15 87/08/11 Copyr 1984 Sun Micro";
32*45091Smckusick #endif
33*45091Smckusick
34*45091Smckusick /*
35*45091Smckusick * svc_raw.c, This a toy for simple testing and timing.
36*45091Smckusick * Interface to create an rpc client and server in the same UNIX process.
37*45091Smckusick * This lets us similate rpc and get rpc (round trip) overhead, without
38*45091Smckusick * any interference from the kernal.
39*45091Smckusick *
40*45091Smckusick * Copyright (C) 1984, Sun Microsystems, Inc.
41*45091Smckusick */
42*45091Smckusick
43*45091Smckusick #include <rpc/rpc.h>
44*45091Smckusick
45*45091Smckusick
46*45091Smckusick /*
47*45091Smckusick * This is the "network" that we will be moving data over
48*45091Smckusick */
49*45091Smckusick static struct svcraw_private {
50*45091Smckusick char _raw_buf[UDPMSGSIZE];
51*45091Smckusick SVCXPRT server;
52*45091Smckusick XDR xdr_stream;
53*45091Smckusick char verf_body[MAX_AUTH_BYTES];
54*45091Smckusick } *svcraw_private;
55*45091Smckusick
56*45091Smckusick static bool_t svcraw_recv();
57*45091Smckusick static enum xprt_stat svcraw_stat();
58*45091Smckusick static bool_t svcraw_getargs();
59*45091Smckusick static bool_t svcraw_reply();
60*45091Smckusick static bool_t svcraw_freeargs();
61*45091Smckusick static void svcraw_destroy();
62*45091Smckusick
63*45091Smckusick static struct xp_ops server_ops = {
64*45091Smckusick svcraw_recv,
65*45091Smckusick svcraw_stat,
66*45091Smckusick svcraw_getargs,
67*45091Smckusick svcraw_reply,
68*45091Smckusick svcraw_freeargs,
69*45091Smckusick svcraw_destroy
70*45091Smckusick };
71*45091Smckusick
72*45091Smckusick SVCXPRT *
svcraw_create()73*45091Smckusick svcraw_create()
74*45091Smckusick {
75*45091Smckusick register struct svcraw_private *srp = svcraw_private;
76*45091Smckusick
77*45091Smckusick if (srp == 0) {
78*45091Smckusick srp = (struct svcraw_private *)calloc(1, sizeof (*srp));
79*45091Smckusick if (srp == 0)
80*45091Smckusick return (0);
81*45091Smckusick }
82*45091Smckusick srp->server.xp_sock = 0;
83*45091Smckusick srp->server.xp_port = 0;
84*45091Smckusick srp->server.xp_ops = &server_ops;
85*45091Smckusick srp->server.xp_verf.oa_base = srp->verf_body;
86*45091Smckusick xdrmem_create(&srp->xdr_stream, srp->_raw_buf, UDPMSGSIZE, XDR_FREE);
87*45091Smckusick return (&srp->server);
88*45091Smckusick }
89*45091Smckusick
90*45091Smckusick static enum xprt_stat
svcraw_stat()91*45091Smckusick svcraw_stat()
92*45091Smckusick {
93*45091Smckusick
94*45091Smckusick return (XPRT_IDLE);
95*45091Smckusick }
96*45091Smckusick
97*45091Smckusick static bool_t
svcraw_recv(xprt,msg)98*45091Smckusick svcraw_recv(xprt, msg)
99*45091Smckusick SVCXPRT *xprt;
100*45091Smckusick struct rpc_msg *msg;
101*45091Smckusick {
102*45091Smckusick register struct svcraw_private *srp = svcraw_private;
103*45091Smckusick register XDR *xdrs;
104*45091Smckusick
105*45091Smckusick if (srp == 0)
106*45091Smckusick return (0);
107*45091Smckusick xdrs = &srp->xdr_stream;
108*45091Smckusick xdrs->x_op = XDR_DECODE;
109*45091Smckusick XDR_SETPOS(xdrs, 0);
110*45091Smckusick if (! xdr_callmsg(xdrs, msg))
111*45091Smckusick return (FALSE);
112*45091Smckusick return (TRUE);
113*45091Smckusick }
114*45091Smckusick
115*45091Smckusick static bool_t
svcraw_reply(xprt,msg)116*45091Smckusick svcraw_reply(xprt, msg)
117*45091Smckusick SVCXPRT *xprt;
118*45091Smckusick struct rpc_msg *msg;
119*45091Smckusick {
120*45091Smckusick register struct svcraw_private *srp = svcraw_private;
121*45091Smckusick register XDR *xdrs;
122*45091Smckusick
123*45091Smckusick if (srp == 0)
124*45091Smckusick return (FALSE);
125*45091Smckusick xdrs = &srp->xdr_stream;
126*45091Smckusick xdrs->x_op = XDR_ENCODE;
127*45091Smckusick XDR_SETPOS(xdrs, 0);
128*45091Smckusick if (! xdr_replymsg(xdrs, msg))
129*45091Smckusick return (FALSE);
130*45091Smckusick (void)XDR_GETPOS(xdrs); /* called just for overhead */
131*45091Smckusick return (TRUE);
132*45091Smckusick }
133*45091Smckusick
134*45091Smckusick static bool_t
svcraw_getargs(xprt,xdr_args,args_ptr)135*45091Smckusick svcraw_getargs(xprt, xdr_args, args_ptr)
136*45091Smckusick SVCXPRT *xprt;
137*45091Smckusick xdrproc_t xdr_args;
138*45091Smckusick caddr_t args_ptr;
139*45091Smckusick {
140*45091Smckusick register struct svcraw_private *srp = svcraw_private;
141*45091Smckusick
142*45091Smckusick if (srp == 0)
143*45091Smckusick return (FALSE);
144*45091Smckusick return ((*xdr_args)(&srp->xdr_stream, args_ptr));
145*45091Smckusick }
146*45091Smckusick
147*45091Smckusick static bool_t
svcraw_freeargs(xprt,xdr_args,args_ptr)148*45091Smckusick svcraw_freeargs(xprt, xdr_args, args_ptr)
149*45091Smckusick SVCXPRT *xprt;
150*45091Smckusick xdrproc_t xdr_args;
151*45091Smckusick caddr_t args_ptr;
152*45091Smckusick {
153*45091Smckusick register struct svcraw_private *srp = svcraw_private;
154*45091Smckusick register XDR *xdrs;
155*45091Smckusick
156*45091Smckusick if (srp == 0)
157*45091Smckusick return (FALSE);
158*45091Smckusick xdrs = &srp->xdr_stream;
159*45091Smckusick xdrs->x_op = XDR_FREE;
160*45091Smckusick return ((*xdr_args)(xdrs, args_ptr));
161*45091Smckusick }
162*45091Smckusick
163*45091Smckusick static void
svcraw_destroy()164*45091Smckusick svcraw_destroy()
165*45091Smckusick {
166*45091Smckusick }
167