00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #if !defined(lint) && defined(SCCSIDS)
00042 static char sccsid[] = "@(#)xdr_mem.c 1.19 87/08/11 Copyr 1984 Sun Micro";
00043 #endif
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056 #include <stdlib.h>
00057 #include <string.h>
00058
00059 #ifdef UNDER_CE
00060 #include <windows.h>
00061 #include <winsock.h>
00062 #else
00063 #include <winsock2.h>
00064 #endif
00065
00066 #include "xdr.h"
00067
00068 static bool_t xdrmem_getlong();
00069 static bool_t xdrmem_putlong();
00070 static bool_t xdrmem_getbytes();
00071 static bool_t xdrmem_putbytes();
00072 static u_int xdrmem_getpos();
00073 static bool_t xdrmem_setpos();
00074 static long * xdrmem_inline();
00075 static void xdrmem_destroy();
00076
00077 static struct xdr_ops xdrmem_ops = {
00078 xdrmem_getlong,
00079 xdrmem_putlong,
00080 xdrmem_getbytes,
00081 xdrmem_putbytes,
00082 xdrmem_getpos,
00083 xdrmem_setpos,
00084 xdrmem_inline,
00085 xdrmem_destroy
00086 };
00087
00088
00089
00090
00091
00092 void
00093 xdrmem_create(xdrs, addr, size, op)
00094 register XDR *xdrs;
00095 caddr_t addr;
00096 u_int size;
00097 enum xdr_op op;
00098 {
00099
00100 xdrs->x_op = op;
00101 xdrs->x_ops = &xdrmem_ops;
00102 xdrs->x_private = xdrs->x_base = addr;
00103 xdrs->x_handy = size;
00104 }
00105
00106 static void
00107 xdrmem_destroy()
00108
00109 {
00110 }
00111
00112 static bool_t
00113 xdrmem_getlong(xdrs, lp)
00114 register XDR *xdrs;
00115 long *lp;
00116 {
00117
00118 if ((xdrs->x_handy -= sizeof(long)) < 0)
00119 return (FALSE);
00120 *lp = (long)ntohl((u_long)(*((long *)(xdrs->x_private))));
00121 xdrs->x_private += sizeof(long);
00122 return (TRUE);
00123 }
00124
00125 static bool_t
00126 xdrmem_putlong(xdrs, lp)
00127 register XDR *xdrs;
00128 long *lp;
00129 {
00130
00131 if ((xdrs->x_handy -= sizeof(long)) < 0)
00132 return (FALSE);
00133 *(long *)xdrs->x_private = (long)htonl((u_long)(*lp));
00134 xdrs->x_private += sizeof(long);
00135 return (TRUE);
00136 }
00137
00138 static bool_t
00139 xdrmem_getbytes(xdrs, addr, len)
00140 register XDR *xdrs;
00141 caddr_t addr;
00142 register u_int len;
00143 {
00144
00145 if ((xdrs->x_handy -= len) < 0)
00146 return (FALSE);
00147 memcpy(addr, xdrs->x_private, len);
00148 xdrs->x_private += len;
00149 return (TRUE);
00150 }
00151
00152 static bool_t
00153 xdrmem_putbytes(xdrs, addr, len)
00154 register XDR *xdrs;
00155 caddr_t addr;
00156 register u_int len;
00157 {
00158
00159 if ((xdrs->x_handy -= len) < 0)
00160 return (FALSE);
00161 memcpy(xdrs->x_private, addr, len);
00162 xdrs->x_private += len;
00163 return (TRUE);
00164 }
00165
00166 static u_int
00167 xdrmem_getpos(xdrs)
00168 register XDR *xdrs;
00169 {
00170
00171 return ((u_int)xdrs->x_private - (u_int)xdrs->x_base);
00172 }
00173
00174 static bool_t
00175 xdrmem_setpos(xdrs, pos)
00176 register XDR *xdrs;
00177 u_int pos;
00178 {
00179 register caddr_t newaddr = xdrs->x_base + pos;
00180 register caddr_t lastaddr = xdrs->x_private + xdrs->x_handy;
00181
00182 if ((long)newaddr > (long)lastaddr)
00183 return (FALSE);
00184 xdrs->x_private = newaddr;
00185 xdrs->x_handy = (int)lastaddr - (int)newaddr;
00186 return (TRUE);
00187 }
00188
00189 static long *
00190 xdrmem_inline(xdrs, len)
00191 register XDR *xdrs;
00192 int len;
00193 {
00194 long *buf = 0;
00195
00196 if (xdrs->x_handy >= len) {
00197 xdrs->x_handy -= len;
00198 buf = (long *) xdrs->x_private;
00199 xdrs->x_private += len;
00200 }
00201 return (buf);
00202 }