svc_raw.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:6k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* svc_raw.c - a toy for simple testing and timing rpc */
  2. /* Copyright 1984-2001 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5.  * Copyright (C) 1984, Sun Microsystems, Inc.
  6.  *
  7.  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
  8.  * unrestricted use provided that this legend is included on all tape
  9.  * media and as a part of the software program in whole or part.  Users
  10.  * may copy or modify Sun RPC without charge, but are not authorized
  11.  * to license or distribute it to anyone else except as part of a product or
  12.  * program developed by the user.
  13.  *
  14.  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
  15.  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
  16.  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
  17.  *
  18.  * Sun RPC is provided with no support and without any obligation on the
  19.  * part of Sun Microsystems, Inc. to assist in its use, correction,
  20.  * modification or enhancement.
  21.  *
  22.  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
  23.  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
  24.  * OR ANY PART THEREOF.
  25.  *
  26.  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
  27.  * or profits or other special, indirect and consequential damages, even if
  28.  * Sun has been advised of the possibility of such damages.
  29.  *
  30.  * Sun Microsystems, Inc.
  31.  * 2550 Garcia Avenue
  32.  * Mountain View, California  94043
  33.  */
  34. /*
  35. modification history
  36. --------------------
  37. 01k,15oct01,rae  merge from truestack ver 01l, base 01j (AE / 5_X)
  38. 01j,26may92,rrr  the tree shuffle
  39.   -changed includes to have absolute path from h/
  40. 01i,04oct91,rrr  passed through the ansification filter
  41.   -changed includes to have absolute path from h/
  42.   -changed VOID to void
  43.   -changed copyright notice
  44. 01h,01apr91,elh   svc_rawInclude added.
  45. 01g,08oct90,hjb   de-linted.
  46. 01f,02oct90,hjb   made raw rpc cleanup after itself properly.
  47. 01e,10may90,dnw   removed _raw_buf back to rpcGbl: it must be shared w/clnt_raw.
  48.   changed svc_rawInit to alloc raw_buf if necessary
  49.   changed to call svc_rawInit at start of every routine (not
  50.     in rpcTaskInit anymore)
  51. 01d,27oct89,hjb   upgraded to 4.0
  52. 01c,19apr89,gae   added svcExit to do tidy cleanup for tasks.
  53.   changed svc_rawInit to return pointer to moduleStatics.
  54. 01b,11nov87,jlf   added wrs copyright, title, mod history, etc.
  55. 01a,01nov87,rdc   first VxWorks version
  56. */
  57. #ifndef lint
  58. /* static char sccsid[] = "@(#)svc_raw.c 1.1 86/02/03 Copyr 1984 Sun Micro"; */
  59. #endif
  60. /*
  61.  * svc_raw.c,   This a toy for simple testing and timing.
  62.  * Interface to create an rpc client and server in the same UNIX process.
  63.  * This lets us similate rpc and get rpc (round trip) overhead, without
  64.  * any interference from the kernal.
  65.  *
  66.  */
  67. #include "rpc/rpctypes.h"
  68. #include "netinet/in.h"
  69. #include "rpc/xdr.h"
  70. #include "rpc/auth.h"
  71. #include "rpc/clnt.h"
  72. #include "rpc/rpc_msg.h"
  73. #include "rpc/svc.h"
  74. #include "vxWorks.h"
  75. #include "memLib.h"
  76. #include "rpc/rpcGbl.h"
  77. #include "memPartLib.h"
  78. #include "stdio.h"
  79. /*
  80.  * This is the "network" that we will be moving data over
  81.  */
  82. LOCAL void svc_rawExit ();
  83. LOCAL struct moduleStatics *svc_rawInit ();
  84. /* pointer to this external buffer is now located in rpcGbl */
  85. /* extern char _raw_buf[UDPMSGSIZE]; */
  86. LOCAL bool_t svcraw_recv();
  87. LOCAL enum xprt_stat  svcraw_stat();
  88. LOCAL bool_t svcraw_getargs();
  89. LOCAL bool_t svcraw_reply();
  90. LOCAL bool_t svcraw_freeargs();
  91. LOCAL void svcraw_destroy();
  92. LOCAL struct xp_ops server_ops = {
  93. svcraw_recv,
  94. svcraw_stat,
  95. svcraw_getargs,
  96. svcraw_reply,
  97. svcraw_freeargs,
  98. svcraw_destroy
  99. };
  100. struct moduleStatics
  101.     {
  102.     SVCXPRT  server;
  103.     XDR  xdr_stream;
  104.     char  verf_body[MAX_AUTH_BYTES];
  105.     };
  106. void svc_rawInclude ()
  107.     {
  108.     }
  109. LOCAL struct moduleStatics *svc_rawInit ()
  110.     {
  111.     FAST struct moduleStatics *pSvc_raw;
  112.     /* check if already initialized */
  113.     if (taskRpcStatics->svc_raw != NULL)
  114. return (taskRpcStatics->svc_raw);
  115.     /* allocate clnt/svc buffer if necessary */
  116.     if (taskRpcStatics->_raw_buf == NULL)
  117. {
  118. taskRpcStatics->_raw_buf = (char *) KHEAP_ALLOC(UDPMSGSIZE);
  119. if (taskRpcStatics->_raw_buf == NULL)
  120.     {
  121.     printErr ("svc_rawInit: out of memory!n");
  122.     return (NULL);
  123.     }
  124. }
  125.     /* allocate module statics */
  126.     pSvc_raw = (struct moduleStatics *)
  127.     KHEAP_ALLOC(sizeof (struct moduleStatics));
  128.     if (pSvc_raw == NULL)
  129. printErr ("svc_rawInit: out of memory!n");
  130.     bzero ((char *)pSvc_raw, sizeof(struct moduleStatics));
  131.     taskRpcStatics->svc_raw = pSvc_raw;
  132.     taskRpcStatics->svc_rawExit = (void (*) ()) svc_rawExit;
  133.     return (pSvc_raw);
  134.     }
  135. LOCAL void svc_rawExit ()
  136.     {
  137.     if (taskRpcStatics->_raw_buf != NULL)
  138. {
  139.         KHEAP_FREE(taskRpcStatics->_raw_buf);
  140. taskRpcStatics->_raw_buf = NULL;
  141. }
  142.     KHEAP_FREE((char *) taskRpcStatics->svc_raw);
  143.     }
  144. SVCXPRT *
  145. svcraw_create()
  146. {
  147. FAST struct moduleStatics *ms = svc_rawInit ();
  148. ms->server.xp_sock = 0;
  149. ms->server.xp_port = 0;
  150. ms->server.xp_ops = &server_ops;
  151. ms->server.xp_verf.oa_base = ms->verf_body;
  152. xdrmem_create(&ms->xdr_stream, taskRpcStatics->_raw_buf, UDPMSGSIZE,
  153.       XDR_FREE);
  154. return (&ms->server);
  155. }
  156. LOCAL enum xprt_stat
  157. svcraw_stat()
  158. {
  159. return (XPRT_IDLE);
  160. }
  161. /* ARGSUSED */
  162. LOCAL bool_t
  163. svcraw_recv(xprt, msg)
  164. SVCXPRT *xprt;
  165. struct rpc_msg *msg;
  166. {
  167. FAST struct moduleStatics *ms = svc_rawInit ();
  168. FAST XDR *xdrs = &ms->xdr_stream;
  169. xdrs->x_op = XDR_DECODE;
  170. XDR_SETPOS(xdrs, 0);
  171. if (! xdr_callmsg(xdrs, msg))
  172.        return (FALSE);
  173. return (TRUE);
  174. }
  175. /* ARGSUSED */
  176. LOCAL bool_t /* 4.0 */
  177. svcraw_reply(xprt, msg)
  178. SVCXPRT *xprt;
  179. struct rpc_msg *msg;
  180. {
  181. FAST struct moduleStatics *ms = svc_rawInit ();
  182. FAST XDR *xdrs = &ms->xdr_stream;
  183. xdrs->x_op = XDR_ENCODE;
  184. XDR_SETPOS(xdrs, 0);
  185. if (! xdr_replymsg(xdrs, msg))
  186.        return (FALSE);
  187. (void)XDR_GETPOS(xdrs);  /* called just for overhead */
  188. return (TRUE);
  189. }
  190. /* ARGSUSED */
  191. LOCAL bool_t /* 4.0 */
  192. svcraw_getargs(xprt, xdr_args, args_ptr)
  193. SVCXPRT *xprt;
  194. xdrproc_t xdr_args;
  195. caddr_t args_ptr;
  196. {
  197. FAST struct moduleStatics *ms = svc_rawInit ();
  198. return ((*xdr_args)(&ms->xdr_stream, args_ptr));
  199. }
  200. /* ARGSUSED */
  201. LOCAL bool_t /* 4.0 */
  202. svcraw_freeargs(xprt, xdr_args, args_ptr)
  203. SVCXPRT *xprt;
  204. xdrproc_t xdr_args;
  205. caddr_t args_ptr;
  206. {
  207. FAST struct moduleStatics *ms = svc_rawInit ();
  208. FAST XDR *xdrs = &ms->xdr_stream;
  209. xdrs->x_op = XDR_FREE;
  210. return ((*xdr_args)(xdrs, args_ptr));
  211. }
  212. LOCAL void /* 4.0 */
  213. svcraw_destroy()
  214. {
  215. }