home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume6 / rpc2 / part09 / rpc / rpclib / xdr_stdio.c < prev   
Encoding:
C/C++ Source or Header  |  1986-11-30  |  4.5 KB  |  189 lines

  1. /*
  2.  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
  3.  * unrestricted use provided that this legend is included on all tape
  4.  * media and as a part of the software program in whole or part.  Users
  5.  * may copy or modify Sun RPC without charge, but are not authorized
  6.  * to license or distribute it to anyone else except as part of a product or
  7.  * program developed by the user.
  8.  * 
  9.  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
  10.  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
  11.  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
  12.  * 
  13.  * Sun RPC is provided with no support and without any obligation on the
  14.  * part of Sun Microsystems, Inc. to assist in its use, correction,
  15.  * modification or enhancement.
  16.  * 
  17.  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
  18.  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
  19.  * OR ANY PART THEREOF.
  20.  * 
  21.  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
  22.  * or profits or other special, indirect and consequential damages, even if
  23.  * Sun has been advised of the possibility of such damages.
  24.  * 
  25.  * Sun Microsystems, Inc.
  26.  * 2550 Garcia Avenue
  27.  * Mountain View, California  94043
  28.  */
  29. #ifndef lint
  30. static char sccsid[] = "@(#)xdr_stdio.c 1.1 86/02/03 Copyr 1984 Sun Micro";
  31. #endif
  32.  
  33. /*
  34.  * xdr_stdio.c, XDR implementation on standard i/o file.
  35.  *
  36.  * Copyright (C) 1984, Sun Microsystems, Inc.
  37.  *
  38.  * This set of routines implements a XDR on a stdio stream.
  39.  * XDR_ENCODE serializes onto the stream, XDR_DECODE de-serializes
  40.  * from the stream.
  41.  */
  42.  
  43. #include "types.h"
  44. #include <stdio.h>
  45. #include "xdr.h"
  46.  
  47. static bool_t    xdrstdio_getlong();
  48. static bool_t    xdrstdio_putlong();
  49. static bool_t    xdrstdio_getbytes();
  50. static bool_t    xdrstdio_putbytes();
  51. static u_int    xdrstdio_getpos();
  52. static bool_t    xdrstdio_setpos();
  53. static long *    xdrstdio_inline();
  54. static void    xdrstdio_destroy();
  55.  
  56. /*
  57.  * Ops vector for stdio type XDR
  58.  */
  59. static struct xdr_ops    xdrstdio_ops = {
  60.     xdrstdio_getlong,    /* deseraialize a long int */
  61.     xdrstdio_putlong,    /* seraialize a long int */
  62.     xdrstdio_getbytes,    /* deserialize counted bytes */
  63.     xdrstdio_putbytes,    /* serialize counted bytes */
  64.     xdrstdio_getpos,    /* get offset in the stream */
  65.     xdrstdio_setpos,    /* set offset in the stream */
  66.     xdrstdio_inline,    /* prime stream for inline macros */
  67.     xdrstdio_destroy    /* destroy stream */
  68. };
  69.  
  70. /*
  71.  * Initialize a stdio xdr stream.
  72.  * Sets the xdr stream handle xdrs for use on the stream file.
  73.  * Operation flag is set to op.
  74.  */
  75. void
  76. xdrstdio_create(xdrs, file, op)
  77.     register XDR *xdrs;
  78.     FILE *file;
  79.     enum xdr_op op;
  80. {
  81.  
  82.     xdrs->x_op = op;
  83.     xdrs->x_ops = &xdrstdio_ops;
  84.     xdrs->x_private = (caddr_t)file;
  85.     xdrs->x_handy = 0;
  86.     xdrs->x_base = 0;
  87. }
  88.  
  89. /*
  90.  * Destroy a stdio xdr stream.
  91.  * Cleans up the xdr stream handle xdrs previously set up by xdrstdio_create.
  92.  */
  93. static void
  94. xdrstdio_destroy(xdrs)
  95.     register XDR *xdrs;
  96. {
  97.     (void)fflush((FILE *)xdrs->x_private);
  98.     /* xx should we close the file ?? */
  99. };
  100.  
  101. static bool_t
  102. xdrstdio_getlong(xdrs, lp)
  103.     XDR *xdrs;
  104.     register long *lp;
  105. {
  106.  
  107.     if (fread((caddr_t)lp, sizeof(long), 1, (FILE *)xdrs->x_private) != 1)
  108.         return (FALSE);
  109. #ifndef mc68000
  110.     *lp = ntohl(*lp);
  111. #endif
  112.     return (TRUE);
  113. }
  114.  
  115. static bool_t
  116. xdrstdio_putlong(xdrs, lp)
  117.     XDR *xdrs;
  118.     long *lp;
  119. {
  120.  
  121. #ifndef mc68000
  122.     long mycopy = htonl(*lp);
  123.     lp = &mycopy;
  124. #endif
  125.     if (fwrite((caddr_t)lp, sizeof(long), 1, (FILE *)xdrs->x_private) != 1)
  126.         return (FALSE);
  127.     return (TRUE);
  128. }
  129.  
  130. static bool_t
  131. xdrstdio_getbytes(xdrs, addr, len)
  132.     XDR *xdrs;
  133.     caddr_t addr;
  134.     u_int len;
  135. {
  136.  
  137.     if ((len != 0) && (fread(addr, (int)len, 1, (FILE *)xdrs->x_private) != 1))
  138.         return (FALSE);
  139.     return (TRUE);
  140. }
  141.  
  142. static bool_t
  143. xdrstdio_putbytes(xdrs, addr, len)
  144.     XDR *xdrs;
  145.     caddr_t addr;
  146.     u_int len;
  147. {
  148.  
  149.     if ((len != 0) && (fwrite(addr, (int)len, 1, (FILE *)xdrs->x_private) != 1))
  150.         return (FALSE);
  151.     return (TRUE);
  152. }
  153.  
  154. static u_int
  155. xdrstdio_getpos(xdrs)
  156.     XDR *xdrs;
  157. {
  158.  
  159.     return ((u_int) ftell((FILE *)xdrs->x_private));
  160. }
  161.  
  162. static bool_t
  163. xdrstdio_setpos(xdrs, pos) 
  164.     XDR *xdrs;
  165.     u_int pos;
  166.  
  167.     return ((fseek((FILE *)xdrs->x_private, (long)pos, 0) < 0) ?
  168.         FALSE : TRUE);
  169. }
  170.  
  171. static long *
  172. xdrstdio_inline(xdrs, len)
  173.     XDR *xdrs;
  174.     u_int len;
  175. {
  176.  
  177.     /*
  178.      * Must do some work to implement this: must insure
  179.      * enough data in the underlying stdio buffer,
  180.      * that the buffer is aligned so that we can indirect through a
  181.      * long *, and stuff this pointer in xdrs->x_buf.  Doing
  182.      * a fread or fwrite to a scratch buffer would defeat
  183.      * most of the gains to be had here and require storage
  184.      * management on this buffer, so we don't do this.
  185.      */
  186.     return (NULL);
  187. }
  188.