xref: /freebsd/crypto/krb5/src/lib/rpc/svc_raw.c (revision 7f2fe78b9dd5f51c821d771b63d2e096f6fd49e9)
1 /* @(#)svc_raw.c	2.1 88/07/29 4.0 RPCSRC */
2 /*
3  * Copyright (c) 2010, Oracle America, Inc.
4  *
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions are met:
9  *
10  *     * Redistributions of source code must retain the above copyright
11  *       notice, this list of conditions and the following disclaimer.
12  *
13  *     * Redistributions in binary form must reproduce the above copyright
14  *       notice, this list of conditions and the following disclaimer in
15  *       the documentation and/or other materials provided with the
16  *       distribution.
17  *
18  *     * Neither the name of the "Oracle America, Inc." nor the names of
19  *       its contributors may be used to endorse or promote products
20  *       derived from this software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
23  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
24  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
25  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26  * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
28  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
29  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
30  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
31  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33  */
34 #if !defined(lint) && defined(SCCSIDS)
35 static char sccsid[] = "@(#)svc_raw.c 1.15 87/08/11 Copyr 1984 Sun Micro";
36 #endif
37 
38 /*
39  * svc_raw.c,   This a toy for simple testing and timing.
40  * Interface to create an rpc client and server in the same UNIX process.
41  * This lets us similate rpc and get rpc (round trip) overhead, without
42  * any interference from the kernel.
43  */
44 
45 #include <gssrpc/rpc.h>
46 
47 
48 /*
49  * This is the "network" that we will be moving data over
50  */
51 static struct svcraw_private {
52 	char	_raw_buf[UDPMSGSIZE];
53 	SVCXPRT	server;
54 	XDR	xdr_stream;
55 	char	verf_body[MAX_AUTH_BYTES];
56 } *svcraw_private;
57 
58 static bool_t		svcraw_recv(SVCXPRT *, struct rpc_msg *);
59 static enum xprt_stat 	svcraw_stat(SVCXPRT *);
60 static bool_t		svcraw_getargs(SVCXPRT *, xdrproc_t, void *);
61 static bool_t		svcraw_reply(SVCXPRT *, struct rpc_msg *);
62 static bool_t		svcraw_freeargs(SVCXPRT *, xdrproc_t, void *);
63 static void		svcraw_destroy(SVCXPRT *);
64 
65 static struct xp_ops server_ops = {
66 	svcraw_recv,
67 	svcraw_stat,
68 	svcraw_getargs,
69 	svcraw_reply,
70 	svcraw_freeargs,
71 	svcraw_destroy
72 };
73 
74 SVCXPRT *
svcraw_create(void)75 svcraw_create(void)
76 {
77 	struct svcraw_private *srp = svcraw_private;
78 
79 	if (srp == 0) {
80 		srp = (struct svcraw_private *)calloc(1, sizeof (*srp));
81 		if (srp == 0)
82 			return (0);
83 		svcraw_private = srp;
84 	}
85 	srp->server.xp_sock = 0;
86 	srp->server.xp_port = 0;
87 	srp->server.xp_ops = &server_ops;
88 	srp->server.xp_verf.oa_base = srp->verf_body;
89 	xdrmem_create(&srp->xdr_stream, srp->_raw_buf, UDPMSGSIZE, XDR_FREE);
90 	return (&srp->server);
91 }
92 
93 static enum xprt_stat
svcraw_stat(SVCXPRT * xprt)94 svcraw_stat(SVCXPRT *xprt)
95 {
96 
97 	return (XPRT_IDLE);
98 }
99 
100 static bool_t
svcraw_recv(SVCXPRT * xprt,struct rpc_msg * msg)101 svcraw_recv(SVCXPRT *xprt, struct rpc_msg *msg)
102 {
103 	struct svcraw_private *srp = svcraw_private;
104 	XDR *xdrs;
105 
106 	if (srp == 0)
107 		return (0);
108 	xdrs = &srp->xdr_stream;
109 	xdrs->x_op = XDR_DECODE;
110 	XDR_SETPOS(xdrs, 0);
111 	if (! xdr_callmsg(xdrs, msg))
112 	       return (FALSE);
113 	return (TRUE);
114 }
115 
116 static bool_t
svcraw_reply(SVCXPRT * xprt,struct rpc_msg * msg)117 svcraw_reply(SVCXPRT *xprt, struct rpc_msg *msg)
118 {
119 	struct svcraw_private *srp = svcraw_private;
120 	XDR *xdrs;
121 
122 	if (srp == 0)
123 		return (FALSE);
124 	xdrs = &srp->xdr_stream;
125 	xdrs->x_op = XDR_ENCODE;
126 	XDR_SETPOS(xdrs, 0);
127 	if (! xdr_replymsg(xdrs, msg))
128 	       return (FALSE);
129 	(void)XDR_GETPOS(xdrs);  /* called just for overhead */
130 	return (TRUE);
131 }
132 
133 static bool_t
svcraw_getargs(SVCXPRT * xprt,xdrproc_t xdr_args,void * args_ptr)134 svcraw_getargs(SVCXPRT *xprt, xdrproc_t xdr_args, void *args_ptr)
135 {
136 	struct svcraw_private *srp = svcraw_private;
137 
138 	if (srp == 0)
139 		return (FALSE);
140 	if (! (*xdr_args)(&srp->xdr_stream, args_ptr)) {
141 		(void)svcraw_freeargs(xprt, xdr_args, args_ptr);
142 		return FALSE;
143 	}
144 	return TRUE;
145 }
146 
147 static bool_t
svcraw_freeargs(SVCXPRT * xprt,xdrproc_t xdr_args,void * args_ptr)148 svcraw_freeargs(SVCXPRT *xprt, xdrproc_t xdr_args, void *args_ptr)
149 {
150 	struct svcraw_private *srp = svcraw_private;
151 	XDR *xdrs;
152 
153 	if (srp == 0)
154 		return (FALSE);
155 	xdrs = &srp->xdr_stream;
156 	xdrs->x_op = XDR_FREE;
157 	return ((*xdr_args)(xdrs, args_ptr));
158 }
159 
160 static void
svcraw_destroy(SVCXPRT * xprt)161 svcraw_destroy(SVCXPRT *xprt)
162 {
163 }
164