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

VxWorks

开发平台:

C/C++

  1. /* wvServer.c - WindView RPC server */
  2. /* Copyright 1994 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01f,09aug96,pr   moved object instrumentation-on back here (SPR #6998).
  8. 01e,07aug96,pr   moved object instrumentation to wvLib.c (SPR #6998).
  9. 01d,31mar94,smb  event logging is turned on after objects are inst.
  10. 01c,25mar94,smb  modified OBJECT_STATUS event logging from the gui.
  11. 01c,22feb94,smb  corrected Copyright date (SPR #2910)
  12. 01b,21jan94,maf  call to wvEvtLog() replaced with wvEvtLog{Enable,Disable}().
  13.    +c_s
  14. 01a,06dec93,c_s  written, based on output of rpcgen.  It differs from that 
  15.    output in these ways: (1) the entry point is vwSvc (),
  16.    rather than main; (2) results are freed; (3) the errno
  17.    is cleared after the portmap setup; (4) the code is 
  18.    in WRS style; (5) includes differ; (6) service routine
  19.    for EVT_LOG_CONTROL is implemented inline so that the
  20.    transport handle is available for computing the calling
  21.    host's IP address.
  22. */
  23. /* includes */
  24. #include "stdio.h"
  25. #include "stdlib.h"
  26. #include "string.h"
  27. #include "errnoLib.h"
  28. #include "rpc/rpc.h"
  29. #include "rpc/pmap_clnt.h"
  30. #include "rpcLib.h"
  31. #include "arpa/inet.h"
  32. #include "inetLib.h"
  33. #include "wvRpc.h"
  34. #include "wvLib.h"
  35. /* forwards */
  36. static void windview_1 ();
  37. /*******************************************************************************
  38. *
  39. * wvSvc - RPC server entry point
  40. *
  41. * This task is spawned by wvServerInit to attach the WindView command service
  42. * to the portmap and install the callback routines.  After this is done 
  43. * the routine will enter svc_run (), never to return under normal 
  44. * circumstances.
  45. *
  46. * SEE ALSO:
  47. * NOMANUAL
  48. */
  49. void wvSvc (void)
  50.     {
  51.     register SVCXPRT *transp;
  52.     rpcTaskInit ();
  53.     (void) pmap_unset (WINDVIEW, WINDVIEW_VERS_CURRENT);
  54.     transp = svcudp_create (RPC_ANYSOCK);
  55.     if (transp == NULL)
  56.         {
  57. fprintf (stderr, "cannot create udp service.");
  58. exit (1);
  59.         }
  60.     if (!svc_register (transp, WINDVIEW, WINDVIEW_VERS_CURRENT, 
  61.        windview_1, IPPROTO_UDP))
  62.         {
  63. fprintf (stderr, 
  64.  "unable to register (WINDVIEW, WINDVIEW_VERS_CURRENT, udp).");
  65. exit (1);
  66.         }
  67.     /* pmap_unset is expected to fail, leaving an errno in the task context.
  68.        Since the error is unimportant we clear it here. */
  69.     errnoSet (0);
  70.     svc_run ();
  71.     fprintf (stderr, "svc_run returned");
  72.     exit (1);
  73.     /* NOTREACHED */
  74.     }
  75. /*******************************************************************************
  76. *
  77. * windview_1 - RPC dispatch routine for version 1 of the WindView cmd protocol
  78. *
  79. * This routine is invoked by the RPC system when dispatching a request
  80. * for the WindView command service.
  81. *
  82. * SEE ALSO:
  83. * NOMANUAL
  84. */
  85. static void windview_1
  86.     (
  87.     struct svc_req *rqstp,
  88.     register SVCXPRT *transp
  89.     )
  90.     {
  91.     union
  92.         {
  93. char *wvproc_symtab_lookup_1_arg;
  94. taskSpawnRec wvproc_task_spawn_1_arg;
  95. callFuncRec wvproc_call_function_1_arg;
  96. evtLogRec wvproc_evt_log_control_1_arg;
  97.     } argument;
  98.     char *result;
  99.     bool_t (*xdr_argument) (), (*xdr_result) ();
  100.     char *(*local) ();
  101.     char hostname [128];
  102.     int zeroResult = 0;
  103.     switch (rqstp->rq_proc)
  104.         {
  105. case NULLPROC:
  106.     (void) svc_sendreply (transp, xdr_void, (char *) NULL);
  107.     return;
  108. case WVPROC_SYMTAB_LOOKUP:
  109.     xdr_argument = xdr_wrapstring;
  110.     xdr_result = xdr_u_long;
  111.     local = (char *(*) ()) wvproc_symtab_lookup_1;
  112.     break;
  113. case WVPROC_TASK_SPAWN:
  114.     xdr_argument = xdr_taskSpawnRec;
  115.     xdr_result = xdr_u_long;
  116.     local = (char *(*) ()) wvproc_task_spawn_1;
  117.     break;
  118. case WVPROC_CALL_FUNCTION:
  119.     xdr_argument = xdr_callFuncRec;
  120.     xdr_result = xdr_u_long;
  121.     local = (char *(*) ()) wvproc_call_function_1;
  122.     break;
  123. case WVPROC_EVT_LOG_CONTROL:
  124.     /* This entry point is handled specially because we'd like
  125.        to use the transport handle to find out the IP address of
  126.        the host that issued this request, and that's not usually
  127.        a paramter of the service routine. */
  128.     xdr_argument = xdr_evtLogRec;
  129.     xdr_result = xdr_u_long;
  130.     memset ((char *) &argument, 0, sizeof (argument));
  131.     if (!svc_getargs (transp, xdr_argument, &argument))
  132. {
  133. svcerr_decode (transp);
  134. return;
  135. }
  136.     
  137.     inet_ntoa_b (svc_getcaller (transp)->sin_addr, hostname);
  138.     wvHostInfoInit (hostname,
  139.     argument.wvproc_evt_log_control_1_arg.portNo);
  140.     if (argument.wvproc_evt_log_control_1_arg.state == TRUE)
  141.                 {
  142.  
  143.                 if (argument.wvproc_evt_log_control_1_arg.mode == OBJECT_STATUS)
  144.                     {
  145.                     wvObjInstModeSet (INSTRUMENT_ON);
  146.                     wvObjInst (1,0,INSTRUMENT_ON);
  147.                     wvObjInst (2,0,INSTRUMENT_ON);
  148.                     wvObjInst (3,0,INSTRUMENT_ON);
  149.                     wvObjInst (4,0,INSTRUMENT_ON);
  150.                     wvSigInst (INSTRUMENT_ON);
  151.                     }
  152. wvEvtLogEnable (argument.wvproc_evt_log_control_1_arg.mode);
  153. }
  154.     else
  155. wvEvtLogDisable ();
  156.     if (!svc_sendreply (transp, xdr_result, (char *) &zeroResult))
  157. {
  158. svcerr_systemerr (transp);
  159. }
  160.     if (!svc_freeargs (transp, xdr_argument, &argument))
  161. {
  162. fprintf (stderr, "unable to free aguments");
  163. exit (1);
  164. }
  165.     return;
  166. default:
  167.     svcerr_noproc (transp);
  168.     return;
  169.         }
  170.     memset ((char *) &argument, 0, sizeof (argument));
  171.     if (!svc_getargs (transp, xdr_argument, &argument))
  172.         {
  173. svcerr_decode (transp);
  174. return;
  175.         }
  176.     result = (*local) (&argument, rqstp);
  177.     if (result != NULL && !svc_sendreply (transp, xdr_result, result))
  178.         {
  179. svcerr_systemerr (transp);
  180.         }
  181.     if (!svc_freeargs (transp, xdr_argument, &argument))
  182.         {
  183. fprintf (stderr, "unable to free arguments");
  184. exit (1);
  185.         }
  186.     /* For reentrancy, the individual service routines return their results
  187.        on the heap.  That memory is freed now. */
  188.     if (result)
  189. {
  190. free (result);
  191. }
  192.     
  193.     return;
  194.     }