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

VxWorks

开发平台:

C/C++

  1. /* xdrcore.c - xdr routine for coding/decoding the "core" WDB data types */
  2. /* Copyright 1988-1994 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01g,10jun95,pad Included rpc/rpc.h
  8. 01f,07jun95,tpr removed xdr_TGT_ADDR_T for the host. function defines by WTX.
  9. 01e,14apr95,ms merged all basic filters into one file.
  10. 01d,04apr95,ms  new data types + made it call xdr_WDB_OPQ_DATA_T.
  11. 01c,06feb95,ms made host side use malloc/free.
  12. 01b,31jan95,ms  handle NULL strings.
  13. 01a,24jan95,ms written.
  14. */
  15. /*
  16. DESCRIPTION
  17. This module contains the eXternal Data Representation (XDR) routine
  18. for manipulating core WDB agent data types.
  19. These XDR filters are always part of the agent, regardless of
  20. how it is scalled. It currently contains:
  21. xdr_WDB_STRING_T /@ code/decode a string @/
  22. xdr_WDB_OPQ_DATA_T /@ code/decode a block of memory @/
  23. xdr_ARRAY /@ code/decode an array @/
  24. xdr_TGT_ADDR_T /@ code/decode a target address @/
  25. xdr_TGT_INT_T /@ code/decode a target address @/
  26. xdr_UINT32 /@ code/decode a 32 bit unsigned int @/
  27. */
  28. /* includes */
  29. #include <rpc/rpc.h>
  30. #include "wdbP.h"
  31. #include "string.h"
  32. /*******************************************************************************
  33. *
  34. * xdr_WDB_STRING_T - code, decode a string.
  35. *
  36. * RETURNS: TRUE if it succeeds, FALSE otherwise.
  37. */
  38. BOOL xdr_WDB_STRING_T
  39.     (
  40.     XDR * xdrs, /* XDR stream */
  41.     WDB_STRING_T * pStr /* pointer to the string */
  42.     )
  43.     {
  44.     UINT32 size = ~0;
  45.     if (xdrs->x_op == XDR_ENCODE)
  46. {
  47. if (*pStr == NULL)
  48.     size = 0;
  49. else
  50.     size = strlen(*pStr) + 1;
  51. }
  52.     if (!xdr_WDB_OPQ_DATA_T (xdrs, pStr, size))
  53. return (FALSE);
  54.     return (TRUE);
  55.     }
  56. /*******************************************************************************
  57. *
  58. * xdr_WDB_OPQ_DATA_T - code, decode opaque data.
  59. *
  60. * RETURNS: TRUE if it succeeds, FALSE otherwise.
  61. */
  62. BOOL xdr_WDB_OPQ_DATA_T
  63.     (
  64.     XDR * xdrs, /* XDR stream */
  65.     WDB_OPQ_DATA_T * ppData, /* address of the data pointer */
  66.     UINT32 size /* number of bytes to process */
  67.     )
  68.     {
  69. #ifndef HOST
  70.     int rndup;
  71. #endif /* !HOST */
  72.     switch (xdrs->x_op)
  73. {
  74. case XDR_FREE:
  75. #ifdef HOST
  76.     if (*ppData != NULL)
  77. free (*ppData);
  78. #endif
  79.     return (TRUE);
  80. case XDR_ENCODE:
  81.     if (! xdr_UINT32 (xdrs, &size))
  82. return (FALSE);
  83.     return (xdr_opaque (xdrs, *ppData, size));
  84. case XDR_DECODE:
  85.     if (! xdr_UINT32 (xdrs, &size))
  86.                 return (FALSE);
  87.     if (size == 0)
  88. {
  89. *ppData = NULL;
  90. return (TRUE);
  91. }
  92. #ifndef HOST
  93.     *ppData = (char *)xdr_inline (xdrs, size);
  94.     if (*ppData == NULL)
  95. return (FALSE);
  96.     rndup = size % BYTES_PER_XDR_UNIT;
  97.     if (rndup > 0)
  98. {
  99. rndup = BYTES_PER_XDR_UNIT - rndup;
  100. (void) xdr_inline (xdrs, rndup);
  101. }
  102. #else
  103.             if (*ppData == NULL)
  104.                 if ((*ppData = (char *) malloc (size)) == NULL)
  105.                     return (FALSE);
  106.             if (!xdr_opaque (xdrs, *ppData, size))
  107.                 return (FALSE);
  108. #endif
  109.     return (TRUE);
  110. }
  111.     return (FALSE);
  112.     }
  113. /******************************************************************************
  114. *
  115. * xdr_UINT32 - code/decode a 32 bit integer.
  116. */ 
  117. BOOL xdr_UINT32
  118.     (
  119.     XDR * xdrs, /* XDR stream */
  120.     UINT32 * pInt /* integer to code */
  121.     )
  122.     {
  123.     switch (xdrs->x_op)
  124. {
  125. case XDR_DECODE:
  126.     return (XDR_GETLONG(xdrs, (long *)pInt));
  127. case XDR_ENCODE:
  128.     return (XDR_PUTLONG(xdrs, (long *)pInt));
  129. case XDR_FREE:
  130. default:
  131.     return (TRUE);
  132. }
  133.     }
  134. /******************************************************************************
  135. *
  136. * xdr_TGT_INT_T - code/decode a target integer.
  137. */ 
  138. BOOL xdr_TGT_INT_T
  139.     (
  140.     XDR * xdrs, /* XDR stream */
  141.     TGT_INT_T * pTgtInt /* target address */
  142.     )
  143.     {
  144.     if (!xdr_UINT32 (xdrs, (UINT32 *)pTgtInt))
  145. return (FALSE);
  146.     return (TRUE);
  147.     }
  148. #ifndef HOST
  149. /******************************************************************************
  150. *
  151. * xdr_TGT_ADDR_T - code/decode a target address.
  152. */ 
  153. BOOL xdr_TGT_ADDR_T
  154.     (
  155.     XDR * xdrs, /* XDR stream */
  156.     TGT_ADDR_T * pTgtAddr /* target address */
  157.     )
  158.     {
  159.     if (!xdr_UINT32 (xdrs, (UINT32 *)pTgtAddr))
  160. return (FALSE);
  161.     return (TRUE);
  162.     }
  163. #endif /* HOST */
  164. /******************************************************************************
  165. *
  166. * xdr_ARRAY - code/decode an array without using malloc.
  167. */ 
  168. BOOL xdr_ARRAY
  169.     (
  170.     XDR * xdrs, /* XDR stream */
  171.     caddr_t * addrp, /* array pointer */
  172.     TGT_INT_T * sizep, /* number of elements */
  173.     TGT_INT_T  maxsize, /* max numberof elements */
  174.     TGT_INT_T  elsize, /* size in bytes of each element */
  175.     xdrproc_t  elproc /* xdr routine to handle each element */
  176.     )
  177.     {
  178. #ifdef HOST
  179.     return (xdr_array (xdrs, addrp, sizep, maxsize, elsize, elproc));
  180. #else /* !HOST */
  181.     TGT_INT_T  i;
  182.     caddr_t  target = *addrp;
  183.     TGT_INT_T  c; /* the actual element count */
  184.     BOOL  stat = TRUE;
  185.     TGT_INT_T  nodesize;
  186.     /* like strings, arrays are really counted arrays */
  187.     if (! xdr_UINT32 (xdrs, (UINT32 *)sizep))
  188.         return (FALSE);
  189.     c = *sizep;
  190.     if ((c > maxsize) && (xdrs->x_op != XDR_FREE))
  191.         return (FALSE);
  192.     nodesize = c * elsize;
  193.     /*
  194.      * if we are deserializing, we may need to allocate an array.
  195.      * We also save time by checking for a null array if we are freeing.
  196.      */
  197.     if (target == NULL)
  198.         {
  199.         switch (xdrs->x_op)
  200.             {
  201.             case XDR_DECODE:
  202.                 if (c == 0)
  203.                     return (TRUE);
  204.                 *addrp = target = (char *)xdr_inline (xdrs, 0);
  205.                 break;
  206.             case XDR_FREE:
  207.                 return (TRUE);
  208.             case XDR_ENCODE:
  209.                 break;
  210.             }
  211.         }
  212.     /*
  213.      * now we xdr each element of the array
  214.      */
  215.     for (i = 0; (i < c) && stat; i++)
  216.         {
  217.         stat = (*elproc)(xdrs, target, ~0);
  218.         target += elsize;
  219.         }
  220.     return (stat);
  221. #endif /* !HOST */
  222.     }