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

VxWorks

开发平台:

C/C++

  1. /* wdbRpcLib.c - RPC routines used by the WDB agent */
  2. /* Copyright 1984-1994 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01d,26may97,elp suppressed erroneous addition in numBytesOut reply computation
  7. (fix SPR 8356).
  8. 01c,15jun95,ms reworked.
  9. 01b,03jun95,ms  added wdbRpcNotifyConnect to set event notify host.
  10. use new commIf structure (sendto/rcvfrom replaces read/write).
  11. 01a,06oct94,ms  written.
  12. */
  13. /*
  14. DESCRIPTION
  15. This library contains routines for sending/receiving RPC messages.
  16. It has been tested with the UDP backend to RPC.
  17. It is possible that the format of an RPC send/reply message may
  18. be different for a different protocol, in which case one would need
  19. only to replace this module.
  20. Also, if RPC authentication is added, this is the only module that
  21. would need to be changed.
  22. */
  23. #include "wdb/wdb.h"
  24. #include "wdb/wdbRpcLib.h"
  25. #include "wdb/wdbLibP.h"
  26. #include "wdb/wdbSvcLib.h"
  27. #include "wdb/wdbCommIfLib.h"
  28. #include "string.h"
  29. /* Offsets within an RPC message */
  30. /* Offsets that apply to both incomming and outgoing messages */
  31. #define RPC_XID 0
  32. #define RPC_DIR 1
  33. /* Offsets for outgoing messages */
  34. #define RPC_AUTH 2
  35. #define RPC_STATUS 5
  36. #define RPC_XDRS_OUT 6
  37. #define RPC_REPLY_HDR_SIZE (RPC_XDRS_OUT * sizeof (int))
  38. /* Offsets for incoming messages */
  39. #define RPC_VERS 2
  40. #define RPC_PROG_NUM 3
  41. #define RPC_VERS_NUM 4
  42. #define RPC_PROC_NUM 5
  43. #define RPC_XDRS_IN 10
  44. #define RPC_RECV_HDR_SIZE (RPC_XDRS_IN * sizeof (int))
  45. /******************************************************************************
  46. *
  47. * wdbRpcXportInit - initialize an RPC transport handle.
  48. */
  49. void wdbRpcXportInit
  50.     (
  51.     WDB_XPORT *  pXport, /* RPC transport handle */
  52.     WDB_COMM_IF * pCommIf, /* underlying communication interface */
  53.     caddr_t    pInBuf, /* input buffer */
  54.     caddr_t    pOutBuf, /* reply buffer */
  55.     u_int    bufSize /* buffer size */
  56.     )
  57.     {
  58.     pXport->pCommIf = pCommIf;
  59.     xdrmem_create (&pXport->xdrs, 0, 0, 0);
  60.     pXport->pInBuf = (UINT32 *)pInBuf;
  61.     pXport->numBytesIn = 0;
  62.     pXport->pOutBuf = (UINT32 *)pOutBuf;
  63.     pXport->numBytesOut = 0;
  64.     pXport->bufSize = bufSize;
  65.     pXport->xid = 0;
  66.     }
  67. /******************************************************************************
  68. *
  69. * wdbRpcRcv - wait for an RPC with a timeout.
  70. *
  71. * RETURNS: TRUE if a message was received. FALSE on timeout.
  72. */
  73. BOOL wdbRpcRcv
  74.     (
  75.     void *      xportHandle,
  76.     struct timeval * tv
  77.     )
  78.     {
  79.     WDB_XPORT *pXport = (WDB_XPORT *)xportHandle;
  80.     UINT32 * pRpcMsg = pXport->pInBuf;
  81.     pXport->numBytesIn = (*pXport->pCommIf->rcvfrom)(pXport->pCommIf->commId,
  82.                            (caddr_t)pXport->pInBuf, wdbCommMtu,
  83.    &pXport->replyAddr, tv);
  84.     /* check the message is for us */
  85.     if ((pXport->numBytesIn < RPC_RECV_HDR_SIZE) ||
  86. (ntohl(pRpcMsg[RPC_PROG_NUM]) != WDBPROG) ||
  87. (ntohl(pRpcMsg[RPC_VERS_NUM]) != WDBVERS))
  88. {
  89. return (FALSE);
  90. }
  91.     /* save away the xid */
  92.     pXport->xid = ntohl(pRpcMsg[RPC_XID]);
  93.     /* call the RPC dispatch routine */
  94.     wdbSvcDispatch (pXport, ntohl(pRpcMsg[RPC_PROC_NUM]));
  95.     return (TRUE);
  96.     }
  97. /******************************************************************************
  98. *
  99. * wdbRpcReply - send an RPC reply.
  100. *
  101. * If the "pReply" parameter passed to us is NULL, it means that
  102. * the XDR output stream in the output buffer has already been filled in
  103. * by the service routine. We need just fill in the static
  104. * header and call the drivers output routine.
  105. */
  106. void wdbRpcReply
  107.     (
  108.     void * xportHandle, /* RPC transport handle */
  109.     BOOL (*xdrProc)(), /* XDR output filter */
  110.     caddr_t reply /* reply buffer */
  111.     )
  112.     {
  113.     WDB_XPORT *pXport = (WDB_XPORT *)xportHandle;
  114.     /* fill in the static part of the reply buffer */
  115.     pXport->pOutBuf[RPC_XID] = htonl(pXport->xid);
  116.     pXport->pOutBuf[RPC_DIR] = htonl(REPLY);
  117.     pXport->pOutBuf[RPC_AUTH] = htonl(MSG_ACCEPTED);
  118.     pXport->pOutBuf[RPC_STATUS] = htonl(SUCCESS);
  119.     /*  XDR encode the reply */
  120.     xdrmem_create (&pXport->xdrs, (caddr_t)pXport->pOutBuf,
  121. pXport->bufSize, XDR_ENCODE);
  122.     XDR_SETPOS (&pXport->xdrs, RPC_REPLY_HDR_SIZE);
  123.     if (!(*xdrProc)(&pXport->xdrs, reply))
  124. return;
  125.     /* calculate the number of bytes sent */
  126.     pXport->numBytesOut = XDR_GETPOS (&pXport->xdrs);
  127.     /* send the reply */
  128.     (*pXport->pCommIf->sendto)(pXport->pCommIf->commId,
  129. (caddr_t)pXport->pOutBuf, pXport->numBytesOut,
  130. &pXport->replyAddr);
  131.     }
  132. /******************************************************************************
  133. *
  134. * wdbRpcReplyErr - send an ERROR reply.
  135. */
  136. void wdbRpcReplyErr
  137.     (
  138.     void * xportHandle, /* RPC transport handle */
  139.     u_int errStatus
  140.     )
  141.     {
  142.     WDB_XPORT *pXport = (WDB_XPORT *)xportHandle;
  143.     /* fill in the static part of the reply buffer */
  144.     pXport->pOutBuf[RPC_XID] = htonl(pXport->xid);
  145.     pXport->pOutBuf[RPC_DIR] = htonl(REPLY);
  146.     pXport->pOutBuf[RPC_AUTH] = htonl(MSG_ACCEPTED);
  147.     pXport->pOutBuf[RPC_STATUS] = htonl(errStatus);
  148.     /* record some info so we can resend the reply if needed */
  149.     pXport->numBytesOut = RPC_REPLY_HDR_SIZE;
  150.     /* send the reply */
  151.     (*pXport->pCommIf->sendto)(pXport->pCommIf->commId,
  152. (caddr_t)pXport->pOutBuf, pXport->numBytesOut,
  153. &pXport->replyAddr);
  154.     }
  155. /******************************************************************************
  156. *
  157. * wdbRpcResendReply - resend the last reply.
  158. *
  159. * Resend the last reply using the current xid (from the last request).
  160. */
  161. void wdbRpcResendReply
  162.     (
  163.     void * xportHandle
  164.     )
  165.     {
  166.     WDB_XPORT *pXport = (WDB_XPORT *)xportHandle;
  167.     /* fill in the static part of the reply buffer */
  168.     pXport->pOutBuf[RPC_XID]    = htonl(pXport->xid);
  169.     pXport->pOutBuf[RPC_DIR]    = htonl(REPLY);
  170.     pXport->pOutBuf[RPC_AUTH]   = htonl(MSG_ACCEPTED);
  171.     pXport->pOutBuf[RPC_STATUS] = htonl(OK);
  172.     /* send the reply */
  173.     (*pXport->pCommIf->sendto)(pXport->pCommIf->commId,
  174.                 (caddr_t)pXport->pOutBuf, pXport->numBytesOut,
  175. &pXport->replyAddr);
  176.     }
  177. /******************************************************************************
  178. *
  179. * wdbRpcNotifyConnect - set address for future wdbRpcNotifyHost's
  180. *
  181. * wdbRpcReply() sends a reply to whomever sent the request.
  182. * wdbRpcNotifyHost, on the other hand, sends data to the
  183. * connected host. This routine allows us to set the address of the
  184. * conected host.
  185. */ 
  186. void wdbRpcNotifyConnect
  187.     (
  188.     void *      xportHandle /* RPC transport handle */
  189.     )
  190.     {
  191.     WDB_XPORT *pXport = (WDB_XPORT *)xportHandle;
  192.     pXport->notifyAddr = pXport->replyAddr;
  193.     }
  194.  
  195. /******************************************************************************
  196. *
  197. * wdbRpcNotifyHost - notify the host over the RPC channel.
  198. *
  199. * This routine sends an RPC packet that is not an RPC reply.
  200. */
  201. void wdbRpcNotifyHost
  202.     (
  203.     void *      xportHandle /* RPC transport handle */
  204.     )
  205.     {
  206.     WDB_XPORT *pXport = (WDB_XPORT *)xportHandle;
  207.     UINT32 rpcNotifyMsg [6];
  208.     if (pXport->pCommIf->notifyHost != NULL)
  209. {
  210. (*pXport->pCommIf->notifyHost)(pXport->pCommIf->commId);
  211. return;
  212. }
  213.     rpcNotifyMsg[RPC_XID] = 0;
  214.     rpcNotifyMsg[RPC_DIR] = htonl(CALL);
  215.     rpcNotifyMsg[RPC_AUTH] = htonl(MSG_DENIED);
  216.     rpcNotifyMsg[RPC_STATUS] = htonl(SYSTEM_ERR);
  217.     (*pXport->pCommIf->sendto)(pXport->pCommIf->commId,
  218. (caddr_t)rpcNotifyMsg, sizeof (rpcNotifyMsg),
  219.  &pXport->notifyAddr);
  220.     }
  221. /******************************************************************************
  222. *
  223. * wdbRpcGetArgs - get arguments from an RPC request.
  224. */
  225. BOOL wdbRpcGetArgs
  226.     (
  227.     void *      xportHandle, /* RPC transport handle */
  228.     BOOL (*xdrProc)(), /* XDR input filter to apply */
  229.     char * args /* where to place the arguments */
  230.     )
  231.     {
  232.     WDB_XPORT *pXport = (WDB_XPORT *)xportHandle;
  233.     xdrmem_create (&pXport->xdrs, (caddr_t)pXport->pInBuf,
  234. pXport->bufSize, XDR_DECODE);
  235.     XDR_SETPOS (&pXport->xdrs, RPC_RECV_HDR_SIZE);
  236.     return ((*xdrProc)(&pXport->xdrs, args));
  237.     }