home *** CD-ROM | disk | FTP | other *** search
/ Serving the Web / ServingTheWeb1995.disc1of1.iso / linux / slacksrce / d / libc / libc-4.6 / libc-4 / libc-linux / rpc / xdr_mem.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-10-02  |  4.2 KB  |  186 lines

  1. /* @(#)xdr_mem.c    2.1 88/07/29 4.0 RPCSRC */
  2. /*
  3.  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
  4.  * unrestricted use provided that this legend is included on all tape
  5.  * media and as a part of the software program in whole or part.  Users
  6.  * may copy or modify Sun RPC without charge, but are not authorized
  7.  * to license or distribute it to anyone else except as part of a product or
  8.  * program developed by the user.
  9.  * 
  10.  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
  11.  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
  12.  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
  13.  * 
  14.  * Sun RPC is provided with no support and without any obligation on the
  15.  * part of Sun Microsystems, Inc. to assist in its use, correction,
  16.  * modification or enhancement.
  17.  * 
  18.  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
  19.  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
  20.  * OR ANY PART THEREOF.
  21.  * 
  22.  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
  23.  * or profits or other special, indirect and consequential damages, even if
  24.  * Sun has been advised of the possibility of such damages.
  25.  * 
  26.  * Sun Microsystems, Inc.
  27.  * 2550 Garcia Avenue
  28.  * Mountain View, California  94043
  29.  */
  30. #if !defined(lint) && defined(SCCSIDS)
  31. static char sccsid[] = "@(#)xdr_mem.c 1.19 87/08/11 Copyr 1984 Sun Micro";
  32. #endif
  33.  
  34. /*
  35.  * xdr_mem.h, XDR implementation using memory buffers.
  36.  *
  37.  * Copyright (C) 1984, Sun Microsystems, Inc.
  38.  *
  39.  * If you have some data to be interpreted as external data representation
  40.  * or to be converted to external data representation in a memory buffer,
  41.  * then this is the package for you.
  42.  *
  43.  */
  44.  
  45.  
  46. #include <rpc/types.h>
  47. #include <rpc/xdr.h>
  48. #include <netinet/in.h>
  49. #include <strings.h>
  50.  
  51. static bool_t    xdrmem_getlong();
  52. static bool_t    xdrmem_putlong();
  53. static bool_t    xdrmem_getbytes();
  54. static bool_t    xdrmem_putbytes();
  55. static u_int    xdrmem_getpos();
  56. static bool_t    xdrmem_setpos();
  57. static long *    xdrmem_inline();
  58. static void    xdrmem_destroy();
  59.  
  60. static struct    xdr_ops xdrmem_ops = {
  61.     xdrmem_getlong,
  62.     xdrmem_putlong,
  63.     xdrmem_getbytes,
  64.     xdrmem_putbytes,
  65.     xdrmem_getpos,
  66.     xdrmem_setpos,
  67.     xdrmem_inline,
  68.     xdrmem_destroy
  69. };
  70.  
  71. /*
  72.  * The procedure xdrmem_create initializes a stream descriptor for a
  73.  * memory buffer.  
  74.  */
  75. void
  76. xdrmem_create(xdrs, addr, size, op)
  77.     register XDR *xdrs;
  78.     caddr_t addr;
  79.     u_int size;
  80.     enum xdr_op op;
  81. {
  82.  
  83.     xdrs->x_op = op;
  84.     xdrs->x_ops = &xdrmem_ops;
  85.     xdrs->x_private = xdrs->x_base = addr;
  86.     xdrs->x_handy = size;
  87. }
  88.  
  89. static void
  90. xdrmem_destroy(/*xdrs*/)
  91.     /*XDR *xdrs;*/
  92. {
  93. }
  94.  
  95. static bool_t
  96. xdrmem_getlong(xdrs, lp)
  97.     register XDR *xdrs;
  98.     long *lp;
  99. {
  100.  
  101.     if ((xdrs->x_handy -= sizeof(long)) < 0)
  102.         return (FALSE);
  103.     *lp = (long)ntohl((u_long)(*((long *)(xdrs->x_private))));
  104.     xdrs->x_private += sizeof(long);
  105.     return (TRUE);
  106. }
  107.  
  108. static bool_t
  109. xdrmem_putlong(xdrs, lp)
  110.     register XDR *xdrs;
  111.     long *lp;
  112. {
  113.  
  114.     if ((xdrs->x_handy -= sizeof(long)) < 0)
  115.         return (FALSE);
  116.     *(long *)xdrs->x_private = (long)htonl((u_long)(*lp));
  117.     xdrs->x_private += sizeof(long);
  118.     return (TRUE);
  119. }
  120.  
  121. static bool_t
  122. xdrmem_getbytes(xdrs, addr, len)
  123.     register XDR *xdrs;
  124.     caddr_t addr;
  125.     register u_int len;
  126. {
  127.  
  128.     if ((xdrs->x_handy -= len) < 0)
  129.         return (FALSE);
  130.     bcopy(xdrs->x_private, addr, len);
  131.     xdrs->x_private += len;
  132.     return (TRUE);
  133. }
  134.  
  135. static bool_t
  136. xdrmem_putbytes(xdrs, addr, len)
  137.     register XDR *xdrs;
  138.     caddr_t addr;
  139.     register u_int len;
  140. {
  141.  
  142.     if ((xdrs->x_handy -= len) < 0)
  143.         return (FALSE);
  144.     bcopy(addr, xdrs->x_private, len);
  145.     xdrs->x_private += len;
  146.     return (TRUE);
  147. }
  148.  
  149. static u_int
  150. xdrmem_getpos(xdrs)
  151.     register XDR *xdrs;
  152. {
  153.  
  154.     return ((u_int)xdrs->x_private - (u_int)xdrs->x_base);
  155. }
  156.  
  157. static bool_t
  158. xdrmem_setpos(xdrs, pos)
  159.     register XDR *xdrs;
  160.     u_int pos;
  161. {
  162.     register caddr_t newaddr = xdrs->x_base + pos;
  163.     register caddr_t lastaddr = xdrs->x_private + xdrs->x_handy;
  164.  
  165.     if ((long)newaddr > (long)lastaddr)
  166.         return (FALSE);
  167.     xdrs->x_private = newaddr;
  168.     xdrs->x_handy = (int)lastaddr - (int)newaddr;
  169.     return (TRUE);
  170. }
  171.  
  172. static long *
  173. xdrmem_inline(xdrs, len)
  174.     register XDR *xdrs;
  175.     int len;
  176. {
  177.     long *buf = 0;
  178.  
  179.     if (xdrs->x_handy >= len) {
  180.         xdrs->x_handy -= len;
  181.         buf = (long *) xdrs->x_private;
  182.         xdrs->x_private += len;
  183.     }
  184.     return (buf);
  185. }
  186.