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

VxWorks

开发平台:

C/C++

  1. /* svc_simple.c - simplified front end to 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. 01p,15oct01,rae  merge from truestack ver 01q, base 01o (AE / 5_X)
  38. 01o,20feb97,jank removed comment in comment L:158
  39. 01n,15sep93,kdl  changed svcudp_create() call to only pass one param (SPR #2427)
  40. 01m,11aug93,jmm  Changed ioctl.h and socket.h to sys/ioctl.h and sys/socket.h
  41. 01l,26may92,rrr  the tree shuffle
  42. 01k,04oct91,rrr  passed through the ansification filter
  43.   -changed includes to have absolute path from h/
  44.   -changed copyright notice
  45. 01j,01apr91,elh   added svc_simpleInclude.
  46. 01i,25oct90,dnw   removed include of utime.h.
  47. 01h,10may90,dnw   moved moduleStatics to rpcGbl; removed init/exit routines
  48.   changed taskModuleList to taskRpcStatics
  49. 01g,19apr90,hjb   de-linted.
  50. 01f,27oct89,hjb   upgraded to 4.0
  51. 01e,04may89,dnw   fixed bug in universal() of not freeing args.
  52. 01d,19apr89,gae   added svc_simpleExit to do tidy cleanup for tasks.
  53.   changed svc_simpleInit to return pointer to moduleStatics.
  54. 01c,05apr88,gae   changed fprintf() to printErr().
  55. 01b,11nov87,jlf   added wrs copyright, title, mod history, etc.
  56. 01a,01nov87,rdc   first VxWorks version
  57. */
  58. #ifndef lint
  59. /* static char sccsid[] = "@(#)svc_simple.c 1.1 86/02/03 Copyr 1984 Sun Micro"; */
  60. #endif
  61. /*
  62.  * svc_simple.c
  63.  * Simplified front end to rpc.
  64.  *
  65.  */
  66. #include "rpc/rpc.h"
  67. #include "sys/socket.h"
  68. #include "vxWorks.h"
  69. #include "memLib.h"
  70. #include "rpc/rpcGbl.h"
  71. #include "memPartLib.h"
  72. #include "stdio.h"
  73. #include "rpc/pmap_clnt.h"
  74. LOCAL void universal(); /* 4.0 */
  75. void svc_simpleInclude ()
  76.     {
  77.     }
  78. int
  79. registerrpc(prognum, versnum, procnum, progname, inproc, outproc)
  80. char *(*progname)();
  81. xdrproc_t inproc, outproc;
  82. {
  83. FAST struct svc_simple *ms = &taskRpcStatics->svc_simple;
  84. if (procnum == NULLPROC) {
  85. printErr ("can't reassign procedure number %dn", NULLPROC);
  86. return (-1);
  87. }
  88. if (!ms->madetransp) {
  89. ms->madetransp = 1;
  90. ms->transp = svcudp_create(RPC_ANYSOCK);
  91. if (ms->transp == NULL) {
  92. printErr ("couldn't create an rpc servern");
  93. return (-1);
  94. }
  95. }
  96. pmap_unset((u_long) prognum, (u_long) versnum);
  97. if (!svc_register(ms->transp, (u_long) prognum, (u_long) versnum,
  98.   universal, IPPROTO_UDP)) {
  99.      printErr ("couldn't register prog %d vers %dn",
  100.   prognum, versnum);
  101. return (-1);
  102. }
  103. ms->pl = (struct proglst *) KHEAP_ALLOC(sizeof(struct proglst));
  104. if (ms->pl == NULL) {
  105. printErr ("registerrpc: out of memoryn");
  106. return (-1);
  107. }
  108. ms->pl->p_progname = progname;
  109. ms->pl->p_prognum = prognum;
  110. ms->pl->p_procnum = procnum;
  111. ms->pl->p_inproc = inproc;
  112. ms->pl->p_outproc = outproc;
  113. ms->pl->p_nxt = ms->proglst;
  114. ms->proglst = ms->pl;
  115. return (0);
  116. }
  117. LOCAL void universal(rqstp, transp) /* 4.0 */
  118. struct svc_req *rqstp;
  119. SVCXPRT *transp;
  120. {
  121. int prog, proc;
  122. char *outdata;
  123. /* XXX char xdrbuf[UDPMSGSIZE]; */
  124. char *xdrbuf = (char *) KHEAP_ALLOC(UDPMSGSIZE);
  125. struct proglst *pl;
  126. FAST struct svc_simple *ms = &taskRpcStatics->svc_simple;
  127. if (xdrbuf == NULL)
  128.     {
  129.     panic ("rpc: universal: out of memoryn");
  130.     return;
  131.     }
  132. /*
  133.  * enforce "procnum 0 is echo" convention
  134.  */
  135. if (rqstp->rq_proc == NULLPROC) {
  136. if (svc_sendreply(transp, xdr_void, (char *) 0) == FALSE) {
  137. printErr ("xxxn");
  138. KHEAP_FREE(xdrbuf);
  139. taskSuspend (0);
  140. }
  141. KHEAP_FREE(xdrbuf);
  142. return;
  143. }
  144. prog = rqstp->rq_prog;
  145. proc = rqstp->rq_proc;
  146. for (pl = ms->proglst; pl != NULL; pl = pl->p_nxt)
  147. if (pl->p_prognum == prog && pl->p_procnum == proc) {
  148. /* decode arguments into a CLEAN buffer */
  149. /*XXX bzero(xdrbuf, sizeof(xdrbuf)); required ! */
  150. bzero(xdrbuf, UDPMSGSIZE); /* required ! */
  151. if (!svc_getargs(transp, pl->p_inproc, xdrbuf)) {
  152. svcerr_decode(transp);
  153. KHEAP_FREE(xdrbuf);
  154. return;
  155. }
  156. outdata = (*(pl->p_progname))(xdrbuf);
  157. if (outdata == NULL && pl->p_outproc != xdr_void)
  158. {
  159. /* there was an error */
  160. KHEAP_FREE(xdrbuf);
  161. return;
  162. }
  163. if (!svc_sendreply(transp, pl->p_outproc, outdata)) {
  164. printErr ("trouble replying to prog %dn",
  165.     pl->p_prognum);
  166. KHEAP_FREE(xdrbuf);
  167. taskSuspend (0);
  168. }
  169. /* free the decoded arguments */
  170. (void)svc_freeargs(transp, pl->p_inproc, xdrbuf);
  171. KHEAP_FREE(xdrbuf);
  172. return;
  173. }
  174. printErr ("never registered prog %dn", prog);
  175. KHEAP_FREE(xdrbuf);
  176. taskSuspend (0);
  177. }