/* * xdr_mem.h, XDR implementation using memory buffers. * * Copyright (C) 1984, Sun Microsystems, Inc. * * If you have some data to be interpreted as external data representation * or to be converted to external data representation in a memory buffer, * then this is the package for you. * */ #include #include #include bool_t Xdrmem_getlong(); bool_t Xdrmem_putlong(); bool_t Xdrmem_getbytes(); bool_t Xdrmem_putbytes(); u_int Xdrmem_getpos(); bool_t Xdrmem_setpos(); long * Xdrmem_inline(); void Xdrmem_destroy(); static struct xdr_ops Xdrmem_ops = { Xdrmem_getlong, Xdrmem_putlong, Xdrmem_getbytes, Xdrmem_putbytes, Xdrmem_getpos, Xdrmem_setpos, Xdrmem_inline, Xdrmem_destroy }; /* * The procedure xdrmem_create initializes a stream descriptor for a * memory buffer. */ void Xdrmem_create(xdrs, addr, size, op) register XDR *xdrs; caddr_t addr; u_int size; enum xdr_op op; { xdrs->x_op = op; xdrs->x_ops = &Xdrmem_ops; xdrs->x_private = xdrs->x_base = addr; xdrs->x_handy = size; } void Xdrmem_destroy(/*xdrs*/) /*XDR *xdrs;*/ { } bool_t Xdrmem_getlong(xdrs, lp) register XDR *xdrs; long *lp; { if ((xdrs->x_handy -= sizeof(long)) < 0) return (FALSE); *lp = (long)ntohl((u_long)(*((long *)(xdrs->x_private)))); xdrs->x_private += sizeof(long); return (TRUE); } bool_t Xdrmem_putlong(xdrs, lp) register XDR *xdrs; long *lp; { if ((xdrs->x_handy -= sizeof(long)) < 0) return (FALSE); *(long *)xdrs->x_private = (long)htonl((u_long)(*lp)); xdrs->x_private += sizeof(long); return (TRUE); } u_int Xdrmem_getpos(xdrs) register XDR *xdrs; { return ((u_int)xdrs->x_private - (u_int)xdrs->x_base); } bool_t Xdrmem_setpos(xdrs, pos) register XDR *xdrs; int pos; { register caddr_t newaddr = xdrs->x_base + pos; register caddr_t lastaddr = xdrs->x_private + xdrs->x_handy; if ((long)newaddr > (long)lastaddr) return (FALSE); xdrs->x_private = newaddr; xdrs->x_handy = (int)lastaddr - (int)newaddr; return (TRUE); }