home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 3 / goldfish_volume_3.bin / files / comm / tcp / amitcp-sdk / src / rpclib / xdr_mem.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-09-29  |  3.2 KB  |  148 lines

  1. /*
  2.  *      $Id: xdr_mem.c,v 4.2 1994/09/29 23:48:50 jraja Exp $
  3.  *
  4.  *      XDR implementation using memory buffers.
  5.  *
  6.  *      Copyright © 1994 AmiTCP/IP Group,
  7.  *                       Network Solutions Development Inc.
  8.  *                       All rights reserved. 
  9.  */
  10.  
  11. /* @(#)xdr_mem.c    2.1 88/07/29 4.0 RPCSRC */
  12. #if !defined(lint) && defined(SCCSIDS)
  13. static char sccsid[] = "@(#)xdr_mem.c 1.19 87/08/11 Copyr 1984 Sun Micro";
  14. #endif
  15.  
  16. /*
  17.  * Copyright (C) 1984, Sun Microsystems, Inc.
  18.  *
  19.  * If you have some data to be interpreted as external data representation
  20.  * or to be converted to external data representation in a memory buffer,
  21.  * then this is the package for you.
  22.  *
  23.  */
  24.  
  25. #include <sys/param.h>
  26. #include <rpc/types.h>
  27. #include <rpc/xdr.h>
  28. #include <netinet/in.h>
  29.  
  30. static bool_t    xdrmem_getlong(XDR * xdrs, long * lp);
  31. static bool_t    xdrmem_putlong(XDR * xdrs, long * lp);
  32. static bool_t    xdrmem_getbytes(XDR * xdrs, caddr_t addr, u_int len);
  33. static bool_t    xdrmem_putbytes(XDR * xdrs, caddr_t addr, u_int len);
  34. static u_int    xdrmem_getpos(XDR * xdrs);
  35. static bool_t    xdrmem_setpos(XDR * xdrs, u_int pos);
  36. static long *    xdrmem_inline(XDR * xdrs, u_int len);
  37. static void    xdrmem_destroy(XDR * xdrs);
  38.  
  39. static struct    xdr_ops xdrmem_ops = {
  40.     xdrmem_getlong,
  41.     xdrmem_putlong,
  42.     xdrmem_getbytes,
  43.     xdrmem_putbytes,
  44.     xdrmem_getpos,
  45.     xdrmem_setpos,
  46.     xdrmem_inline,
  47.     xdrmem_destroy
  48. };
  49.  
  50. /*
  51.  * The procedure xdrmem_create initializes a stream descriptor for a
  52.  * memory buffer.  
  53.  */
  54. void
  55. xdrmem_create(xdrs, addr, size, op)
  56.     register XDR *xdrs;
  57.     caddr_t addr;
  58.     u_int size;
  59.     enum xdr_op op;
  60. {
  61.  
  62.     xdrs->x_op = op;
  63.     xdrs->x_ops = &xdrmem_ops;
  64.     xdrs->x_private = xdrs->x_base = addr;
  65.     xdrs->x_handy = size;
  66. }
  67.  
  68. static void
  69. xdrmem_destroy(XDR *xdrs)
  70. {
  71. }
  72.  
  73. static bool_t
  74. xdrmem_getlong(register XDR *xdrs, long *lp)
  75. {
  76.  
  77.     if ((xdrs->x_handy -= sizeof(long)) < 0)
  78.         return (FALSE);
  79.     *lp = (long)ntohl((u_long)(*((long *)(xdrs->x_private))));
  80.     xdrs->x_private += sizeof(long);
  81.     return (TRUE);
  82. }
  83.  
  84. static bool_t
  85. xdrmem_putlong(register XDR *xdrs, long *lp)
  86. {
  87.  
  88.     if ((xdrs->x_handy -= sizeof(long)) < 0)
  89.         return (FALSE);
  90.     *(long *)xdrs->x_private = (long)htonl((u_long)(*lp));
  91.     xdrs->x_private += sizeof(long);
  92.     return (TRUE);
  93. }
  94.  
  95. static bool_t
  96. xdrmem_getbytes(register XDR *xdrs, caddr_t addr, register u_int len)
  97. {
  98.  
  99.     if ((xdrs->x_handy -= len) < 0)
  100.         return (FALSE);
  101.     bcopy(xdrs->x_private, addr, len);
  102.     xdrs->x_private += len;
  103.     return (TRUE);
  104. }
  105.  
  106. static bool_t
  107. xdrmem_putbytes(register XDR *xdrs, caddr_t addr, register u_int len)
  108. {
  109.  
  110.     if ((xdrs->x_handy -= len) < 0)
  111.         return (FALSE);
  112.     bcopy(addr, xdrs->x_private, len);
  113.     xdrs->x_private += len;
  114.     return (TRUE);
  115. }
  116.  
  117. static u_int
  118. xdrmem_getpos(register XDR *xdrs)
  119. {
  120.     return ((u_int)xdrs->x_private - (u_int)xdrs->x_base);
  121. }
  122.  
  123. static bool_t
  124. xdrmem_setpos(register XDR *xdrs, u_int pos)
  125. {
  126.     register caddr_t newaddr = xdrs->x_base + pos;
  127.     register caddr_t lastaddr = xdrs->x_private + xdrs->x_handy;
  128.  
  129.     if ((long)newaddr > (long)lastaddr)
  130.         return (FALSE);
  131.     xdrs->x_private = newaddr;
  132.     xdrs->x_handy = (int)lastaddr - (int)newaddr;
  133.     return (TRUE);
  134. }
  135.  
  136. static long *
  137. xdrmem_inline(register XDR *xdrs, u_int len)
  138. {
  139.     long *buf = 0;
  140.  
  141.     if (xdrs->x_handy >= len) {
  142.         xdrs->x_handy -= len;
  143.         buf = (long *) xdrs->x_private;
  144.         xdrs->x_private += len;
  145.     }
  146.     return (buf);
  147. }
  148.