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

VxWorks

开发平台:

C/C++

  1. /* xdr_mem.c - XDR implementation using memory buffers */
  2. /* Copyright 1984-1999 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. 01g,27jul99,elg  Add xdrmem_putlongs() and xdrmem_putwords() routines.
  38. 01f,26may92,rrr  the tree shuffle
  39.   -changed includes to have absolute path from h/
  40. 01e,04oct91,rrr  passed through the ansification filter
  41.   -changed includes to have absolute path from h/
  42.   -changed copyright notice
  43. 01d,19apr90,hjb   de-linted.
  44. 01c,27oct89,hjb   upgraded to 4.0
  45. 01b,11nov87,jlf   added wrs copyright, title, mod history, etc.
  46. 01a,01nov87,rdc   first VxWorks version
  47. */
  48. #ifndef lint
  49. /* static char sccsid[] = "@(#)xdr_mem.c 1.1 86/02/03 Copyr 1984 Sun Micro"; */
  50. #endif
  51. /*
  52.  * xdr_mem.c, XDR implementation using memory buffers.
  53.  *
  54.  * If you have some data to be interpreted as external data representation
  55.  * or to be converted to external data representation in a memory buffer,
  56.  * then this is the package for you.
  57.  *
  58.  */
  59. #include "rpc/rpctypes.h"
  60. #include "rpc/xdr.h"
  61. #include "netinet/in.h"
  62. #include "vxWorks.h"
  63. LOCAL bool_t xdrmem_getlong();
  64. LOCAL bool_t xdrmem_putlong();
  65. LOCAL bool_t xdrmem_getbytes();
  66. LOCAL bool_t xdrmem_putbytes();
  67. LOCAL bool_t xdrmem_putwords();
  68. LOCAL bool_t xdrmem_putlongs();
  69. LOCAL u_int xdrmem_getpos();
  70. LOCAL bool_t xdrmem_setpos();
  71. LOCAL long * xdrmem_inline();
  72. LOCAL void xdrmem_destroy();
  73. static struct xdr_ops xdrmem_ops = {
  74. xdrmem_getlong,
  75. xdrmem_putlong,
  76. xdrmem_getbytes,
  77. xdrmem_putbytes,
  78. xdrmem_putwords,
  79. xdrmem_putlongs,
  80. xdrmem_getpos,
  81. xdrmem_setpos,
  82. xdrmem_inline,
  83. xdrmem_destroy
  84. };
  85. /*
  86.  * The procedure xdrmem_create initializes a stream descriptor for a
  87.  * memory buffer.
  88.  */
  89. void
  90. xdrmem_create(xdrs, addr, size, op)
  91. register XDR *xdrs;
  92. caddr_t addr;
  93. u_int size;
  94. enum xdr_op op;
  95. {
  96. xdrs->x_op = op;
  97. xdrs->x_ops = &xdrmem_ops;
  98. xdrs->x_private = xdrs->x_base = addr;
  99. xdrs->x_handy = size;
  100. }
  101. LOCAL void /* 4.0 */
  102. xdrmem_destroy(/*xdrs*/)
  103. /*XDR *xdrs;*/
  104. {
  105. }
  106. LOCAL bool_t /* 4.0 */
  107. xdrmem_getlong(xdrs, lp)
  108. register XDR *xdrs;
  109. long *lp;
  110. {
  111. if ((xdrs->x_handy -= sizeof(long)) < 0)
  112. return (FALSE);
  113. *lp = ntohl(*((u_long *)(xdrs->x_private)));
  114. xdrs->x_private += sizeof(long);
  115. return (TRUE);
  116. }
  117. LOCAL bool_t /* 4.0 */
  118. xdrmem_putlong(xdrs, lp)
  119. register XDR *xdrs;
  120. long *lp;
  121. {
  122. if ((xdrs->x_handy -= sizeof(long)) < 0)
  123. return (FALSE);
  124. *(u_long *)xdrs->x_private = htonl((u_long) *lp);
  125. xdrs->x_private += sizeof(long);
  126. return (TRUE);
  127. }
  128. LOCAL bool_t /* 4.0 */
  129. xdrmem_getbytes(xdrs, addr, len)
  130. register XDR *xdrs;
  131. caddr_t addr;
  132. register u_int len;
  133. {
  134. if ((xdrs->x_handy -= len) < 0)
  135. return (FALSE);
  136. bcopy(xdrs->x_private, addr, (int) len);
  137. xdrs->x_private += len;
  138. return (TRUE);
  139. }
  140. LOCAL bool_t /* 4.0 */
  141. xdrmem_putbytes(xdrs, addr, len)
  142. register XDR *xdrs;
  143. caddr_t addr;
  144. register u_int len;
  145. {
  146. if ((xdrs->x_handy -= len) < 0)
  147. return (FALSE);
  148. bcopy(addr, xdrs->x_private, (int) len);
  149. xdrs->x_private += len;
  150. return (TRUE);
  151. }
  152. LOCAL bool_t /* 4.0 */
  153. xdrmem_putwords (xdrs, addr, len)
  154. register XDR * xdrs;
  155. caddr_t  addr;
  156. register u_int  len;
  157. {
  158. if ((xdrs->x_handy -= len * 2) < 0)
  159. return (FALSE);
  160. bcopyWords (addr, xdrs->x_private, (int) len);
  161. xdrs->x_private += len * 2;
  162. return (TRUE);
  163. }
  164. LOCAL bool_t /* 4.0 */
  165. xdrmem_putlongs (xdrs, addr, len)
  166. register XDR * xdrs;
  167. caddr_t  addr;
  168. register u_int  len;
  169. {
  170. if ((xdrs->x_handy -= len * 4) < 0)
  171. return (FALSE);
  172. bcopyLongs (addr, xdrs->x_private, (int) len);
  173. xdrs->x_private += len * 4;
  174. return (TRUE);
  175. }
  176. LOCAL u_int /* 4.0 */
  177. xdrmem_getpos(xdrs)
  178. register XDR *xdrs;
  179. {
  180. return ((u_int)xdrs->x_private - (u_int)xdrs->x_base);
  181. }
  182. LOCAL bool_t /* 4.0 */
  183. xdrmem_setpos(xdrs, pos)
  184. register XDR *xdrs;
  185. u_int pos;
  186. {
  187. register caddr_t newaddr = xdrs->x_base + pos;
  188. register caddr_t lastaddr = xdrs->x_private + xdrs->x_handy;
  189. if ((long)newaddr > (long)lastaddr)
  190. return (FALSE);
  191. xdrs->x_private = newaddr;
  192. xdrs->x_handy = (int)lastaddr - (int)newaddr;
  193. return (TRUE);
  194. }
  195. LOCAL long * /* 4.0 */
  196. xdrmem_inline(xdrs, len)
  197. register XDR *xdrs;
  198. int len;
  199. {
  200. long *buf = 0;
  201. if (xdrs->x_handy >= len) {
  202. xdrs->x_handy -= len;
  203. buf = (long *) xdrs->x_private;
  204. xdrs->x_private += len;
  205. }
  206. return (buf);
  207. }