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_stdio.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-10-02  |  4.6 KB  |  191 lines

  1. /* @(#)xdr_stdio.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_stdio.c 1.16 87/08/11 Copyr 1984 Sun Micro";
  32. #endif
  33.  
  34. /*
  35.  * xdr_stdio.c, XDR implementation on standard i/o file.
  36.  *
  37.  * Copyright (C) 1984, Sun Microsystems, Inc.
  38.  *
  39.  * This set of routines implements a XDR on a stdio stream.
  40.  * XDR_ENCODE serializes onto the stream, XDR_DECODE de-serializes
  41.  * from the stream.
  42.  */
  43.  
  44. #include <rpc/types.h>
  45. #include <stdio.h>
  46. #include <rpc/xdr.h>
  47. #include <netinet/in.h>
  48.  
  49. static bool_t    xdrstdio_getlong();
  50. static bool_t    xdrstdio_putlong();
  51. static bool_t    xdrstdio_getbytes();
  52. static bool_t    xdrstdio_putbytes();
  53. static u_int    xdrstdio_getpos();
  54. static bool_t    xdrstdio_setpos();
  55. static long *    xdrstdio_inline();
  56. static void    xdrstdio_destroy();
  57.  
  58. /*
  59.  * Ops vector for stdio type XDR
  60.  */
  61. static struct xdr_ops    xdrstdio_ops = {
  62.     xdrstdio_getlong,    /* deseraialize a long int */
  63.     xdrstdio_putlong,    /* seraialize a long int */
  64.     xdrstdio_getbytes,    /* deserialize counted bytes */
  65.     xdrstdio_putbytes,    /* serialize counted bytes */
  66.     xdrstdio_getpos,    /* get offset in the stream */
  67.     xdrstdio_setpos,    /* set offset in the stream */
  68.     xdrstdio_inline,    /* prime stream for inline macros */
  69.     xdrstdio_destroy    /* destroy stream */
  70. };
  71.  
  72. /*
  73.  * Initialize a stdio xdr stream.
  74.  * Sets the xdr stream handle xdrs for use on the stream file.
  75.  * Operation flag is set to op.
  76.  */
  77. void
  78. xdrstdio_create(xdrs, file, op)
  79.     register XDR *xdrs;
  80.     FILE *file;
  81.     enum xdr_op op;
  82. {
  83.  
  84.     xdrs->x_op = op;
  85.     xdrs->x_ops = &xdrstdio_ops;
  86.     xdrs->x_private = (caddr_t)file;
  87.     xdrs->x_handy = 0;
  88.     xdrs->x_base = 0;
  89. }
  90.  
  91. /*
  92.  * Destroy a stdio xdr stream.
  93.  * Cleans up the xdr stream handle xdrs previously set up by xdrstdio_create.
  94.  */
  95. static void
  96. xdrstdio_destroy(xdrs)
  97.     register XDR *xdrs;
  98. {
  99.     (void)fflush((FILE *)xdrs->x_private);
  100.     /* xx should we close the file ?? */
  101. };
  102.  
  103. static bool_t
  104. xdrstdio_getlong(xdrs, lp)
  105.     XDR *xdrs;
  106.     register long *lp;
  107. {
  108.  
  109.     if (fread((caddr_t)lp, sizeof(long), 1, (FILE *)xdrs->x_private) != 1)
  110.         return (FALSE);
  111. #ifndef mc68000
  112.     *lp = ntohl(*lp);
  113. #endif
  114.     return (TRUE);
  115. }
  116.  
  117. static bool_t
  118. xdrstdio_putlong(xdrs, lp)
  119.     XDR *xdrs;
  120.     long *lp;
  121. {
  122.  
  123. #ifndef mc68000
  124.     long mycopy = htonl(*lp);
  125.     lp = &mycopy;
  126. #endif
  127.     if (fwrite((caddr_t)lp, sizeof(long), 1, (FILE *)xdrs->x_private) != 1)
  128.         return (FALSE);
  129.     return (TRUE);
  130. }
  131.  
  132. static bool_t
  133. xdrstdio_getbytes(xdrs, addr, len)
  134.     XDR *xdrs;
  135.     caddr_t addr;
  136.     u_int len;
  137. {
  138.  
  139.     if ((len != 0) && (fread(addr, (int)len, 1, (FILE *)xdrs->x_private) != 1))
  140.         return (FALSE);
  141.     return (TRUE);
  142. }
  143.  
  144. static bool_t
  145. xdrstdio_putbytes(xdrs, addr, len)
  146.     XDR *xdrs;
  147.     caddr_t addr;
  148.     u_int len;
  149. {
  150.  
  151.     if ((len != 0) && (fwrite(addr, (int)len, 1, (FILE *)xdrs->x_private) != 1))
  152.         return (FALSE);
  153.     return (TRUE);
  154. }
  155.  
  156. static u_int
  157. xdrstdio_getpos(xdrs)
  158.     XDR *xdrs;
  159. {
  160.  
  161.     return ((u_int) ftell((FILE *)xdrs->x_private));
  162. }
  163.  
  164. static bool_t
  165. xdrstdio_setpos(xdrs, pos) 
  166.     XDR *xdrs;
  167.     u_int pos;
  168.  
  169.     return ((fseek((FILE *)xdrs->x_private, (long)pos, 0) < 0) ?
  170.         FALSE : TRUE);
  171. }
  172.  
  173. static long *
  174. xdrstdio_inline(xdrs, len)
  175.     XDR *xdrs;
  176.     u_int len;
  177. {
  178.  
  179.     /*
  180.      * Must do some work to implement this: must insure
  181.      * enough data in the underlying stdio buffer,
  182.      * that the buffer is aligned so that we can indirect through a
  183.      * long *, and stuff this pointer in xdrs->x_buf.  Doing
  184.      * a fread or fwrite to a scratch buffer would defeat
  185.      * most of the gains to be had here and require storage
  186.      * management on this buffer, so we don't do this.
  187.      */
  188.     return (NULL);
  189. }
  190.