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 }