xref: /csrg-svn/lib/librpc/rpc/svc_raw.c (revision 45091)
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