xdr_stdio.c 4.6 KB

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