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 #if !defined(lint) && defined(SCCSIDS)
00031 static char sccsid[] = "@(#)xdr_mem.c 1.19 87/08/11 Copyr 1984 Sun Micro";
00032 #endif
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00049 #include <rpc/types.h>
00050 #include <rpc/xdr.h>
00051 #include <netinet/in.h>
00052 #include <string.h>             
00053 
00054 static bool_t xdrmem_getlong ();
00055 static bool_t xdrmem_putlong ();
00056 static bool_t xdrmem_getbytes ();
00057 static bool_t xdrmem_putbytes ();
00058 static u_int xdrmem_getpos ();
00059 static bool_t xdrmem_setpos ();
00060 static long *xdrmem_inline ();
00061 static void xdrmem_destroy ();
00062 
00063 static struct xdr_ops xdrmem_ops =
00064 {
00065         xdrmem_getlong,
00066         xdrmem_putlong,
00067         xdrmem_getbytes,
00068         xdrmem_putbytes,
00069         xdrmem_getpos,
00070         xdrmem_setpos,
00071         xdrmem_inline,
00072         xdrmem_destroy
00073 };
00074 
00075 
00076 
00077 
00078 
00079 void xdrmem_create (xdrs, addr, size, op)
00080      register XDR *xdrs;
00081      caddr_t addr;
00082      u_int size;
00083      enum xdr_op op;
00084 {
00085 
00086         xdrs->x_op = op;
00087         xdrs->x_ops = &xdrmem_ops;
00088         xdrs->x_private = xdrs->x_base = addr;
00089         xdrs->x_handy = size;
00090 }
00091 
00092 static void xdrmem_destroy (  )
00093         
00094 {
00095 }
00096 
00097 static bool_t
00098   xdrmem_getlong (xdrs, lp)
00099      register XDR *xdrs;
00100      long *lp;
00101 {
00102 
00103         if ((xdrs->x_handy -= sizeof (long)) < 0)
00104                   return (FALSE);
00105         *lp = (long) ntohl ((u_long) (*((long *) (xdrs->x_private))));
00106         xdrs->x_private += sizeof (long);
00107         return (TRUE);
00108 }
00109 
00110 static bool_t
00111   xdrmem_putlong (xdrs, lp)
00112      register XDR *xdrs;
00113      long *lp;
00114 {
00115 
00116         if ((xdrs->x_handy -= sizeof (long)) < 0)
00117                   return (FALSE);
00118         *(long *) xdrs->x_private = (long) htonl ((u_long) (*lp));
00119         xdrs->x_private += sizeof (long);
00120         return (TRUE);
00121 }
00122 
00123 static bool_t
00124   xdrmem_getbytes (xdrs, addr, len)
00125      register XDR *xdrs;
00126      caddr_t addr;
00127      register u_int len;
00128 {
00129 
00130         if ((xdrs->x_handy -= len) < 0)
00131                 return (FALSE);
00132         bcopy (xdrs->x_private, addr, len);
00133         xdrs->x_private += len;
00134         return (TRUE);
00135 }
00136 
00137 static bool_t
00138   xdrmem_putbytes (xdrs, addr, len)
00139      register XDR *xdrs;
00140      caddr_t addr;
00141      register u_int len;
00142 {
00143 
00144         if ((xdrs->x_handy -= len) < 0)
00145                 return (FALSE);
00146         bcopy (addr, xdrs->x_private, len);
00147         xdrs->x_private += len;
00148         return (TRUE);
00149 }
00150 
00151 static u_int
00152   xdrmem_getpos (xdrs)
00153      register XDR *xdrs;
00154 {
00155 
00156         return ((u_int) xdrs->x_private - (u_int) xdrs->x_base);
00157 }
00158 
00159 static bool_t
00160   xdrmem_setpos (xdrs, pos)
00161      register XDR *xdrs;
00162      u_int pos;
00163 {
00164         register caddr_t newaddr = xdrs->x_base + pos;
00165         register caddr_t lastaddr = xdrs->x_private + xdrs->x_handy;
00166 
00167         if ((long) newaddr > (long) lastaddr)
00168                 return (FALSE);
00169         xdrs->x_private = newaddr;
00170         xdrs->x_handy = (int) lastaddr - (int) newaddr;
00171         return (TRUE);
00172 }
00173 
00174 static long *
00175   xdrmem_inline (xdrs, len)
00176      register XDR *xdrs;
00177      int len;
00178 {
00179         long *buf = 0;
00180 
00181         if (xdrs->x_handy >= len) {
00182                 xdrs->x_handy -= len;
00183                 buf = (long *) xdrs->x_private;
00184                 xdrs->x_private += len;
00185         }
00186         return (buf);
00187 }