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