1 /* @(#)svc_raw.c 2.1 88/07/29 4.0 RPCSRC */ 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 #if !defined(lint) && defined(SCCSIDS) 31 static char sccsid[] = "@(#)svc_raw.c 1.15 87/08/11 Copyr 1984 Sun Micro"; 32 #endif 33 34 /* 35 * svc_raw.c, This a toy for simple testing and timing. 36 * Interface to create an rpc client and server in the same UNIX process. 37 * This lets us similate rpc and get rpc (round trip) overhead, without 38 * any interference from the kernal. 39 * 40 * Copyright (C) 1984, Sun Microsystems, Inc. 41 */ 42 43 #include <rpc/rpc.h> 44 45 46 /* 47 * This is the "network" that we will be moving data over 48 */ 49 static struct svcraw_private { 50 char _raw_buf[UDPMSGSIZE]; 51 SVCXPRT server; 52 XDR xdr_stream; 53 char verf_body[MAX_AUTH_BYTES]; 54 } *svcraw_private; 55 56 static bool_t svcraw_recv(); 57 static enum xprt_stat svcraw_stat(); 58 static bool_t svcraw_getargs(); 59 static bool_t svcraw_reply(); 60 static bool_t svcraw_freeargs(); 61 static void svcraw_destroy(); 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() 74 { 75 register struct svcraw_private *srp = svcraw_private; 76 77 if (srp == 0) { 78 srp = (struct svcraw_private *)calloc(1, sizeof (*srp)); 79 if (srp == 0) 80 return (0); 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 static enum xprt_stat 91 svcraw_stat() 92 { 93 94 return (XPRT_IDLE); 95 } 96 97 static bool_t 98 svcraw_recv(xprt, msg) 99 SVCXPRT *xprt; 100 struct rpc_msg *msg; 101 { 102 register struct svcraw_private *srp = svcraw_private; 103 register XDR *xdrs; 104 105 if (srp == 0) 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 static bool_t 116 svcraw_reply(xprt, msg) 117 SVCXPRT *xprt; 118 struct rpc_msg *msg; 119 { 120 register struct svcraw_private *srp = svcraw_private; 121 register XDR *xdrs; 122 123 if (srp == 0) 124 return (FALSE); 125 xdrs = &srp->xdr_stream; 126 xdrs->x_op = XDR_ENCODE; 127 XDR_SETPOS(xdrs, 0); 128 if (! xdr_replymsg(xdrs, msg)) 129 return (FALSE); 130 (void)XDR_GETPOS(xdrs); /* called just for overhead */ 131 return (TRUE); 132 } 133 134 static bool_t 135 svcraw_getargs(xprt, xdr_args, args_ptr) 136 SVCXPRT *xprt; 137 xdrproc_t xdr_args; 138 caddr_t args_ptr; 139 { 140 register struct svcraw_private *srp = svcraw_private; 141 142 if (srp == 0) 143 return (FALSE); 144 return ((*xdr_args)(&srp->xdr_stream, args_ptr)); 145 } 146 147 static bool_t 148 svcraw_freeargs(xprt, xdr_args, args_ptr) 149 SVCXPRT *xprt; 150 xdrproc_t xdr_args; 151 caddr_t args_ptr; 152 { 153 register struct svcraw_private *srp = svcraw_private; 154 register XDR *xdrs; 155 156 if (srp == 0) 157 return (FALSE); 158 xdrs = &srp->xdr_stream; 159 xdrs->x_op = XDR_FREE; 160 return ((*xdr_args)(xdrs, args_ptr)); 161 } 162 163 static void 164 svcraw_destroy() 165 { 166 } 167