xdr_stdio.c 4.6 KB

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