/* * Before reading (deserializing from the stream, one should always call * this procedure to guarantee proper record alignment. */ bool_t xdrrec_skiprecord(XDR *xdrs) { RECSTREAM *rstrm = (RECSTREAM *)(xdrs->x_private); enum xprt_stat xstat; if (rstrm->nonblock) { if (__xdrrec_getrec(xdrs, &xstat, FALSE)) { rstrm->fbtbc = 0; return TRUE; } if (rstrm->in_finger == rstrm->in_boundry && xstat == XPRT_MOREREQS) { rstrm->fbtbc = 0; return TRUE; } return FALSE; } while (rstrm->fbtbc > 0 || (! rstrm->last_frag)) { if (! skip_input_bytes(rstrm, rstrm->fbtbc)) return (FALSE); rstrm->fbtbc = 0; if ((! rstrm->last_frag) && (! set_input_fragment(rstrm))) return (FALSE); } rstrm->last_frag = FALSE; return (TRUE); }
static bool_t /* must manage buffers, fragments, and records */ xdrrec_getbytes( XDR *xdrs, void *baddr, uint_t len) { char *addr = baddr; RECSTREAM *rstrm = (RECSTREAM *)(xdrs->x_private); int current; while (len > 0) { current = rstrm->fbtbc; if (current == 0) { if (rstrm->last_frag) return (FALSE); if (! set_input_fragment(rstrm)) return (FALSE); continue; } current = (len < current) ? len : current; if (! get_input_bytes(rstrm, addr, current)) return (FALSE); addr += current; rstrm->fbtbc -= current; len -= current; } return (TRUE); }
/* * Before reading (deserializing) from the stream, one should always call * this procedure to guarantee proper record alignment. */ XDR_API bool_t xdrrec_skiprecord(XDR *xdrs) { /* LINTED pointer cast */ RECSTREAM *rstrm = (RECSTREAM *)(xdrs->x_private); if (rstrm->in_nonblock) { enum xprt_stat pstat; /* * Read and discard a record from the non-blocking * buffer. Return succes only if a complete record can * be retrieved without blocking, or if the buffer was * empty and there was no data to fetch. */ if (__xdrrec_getbytes_nonblock(xdrs, &pstat) || (pstat == XPRT_MOREREQS && rstrm->in_finger == rstrm->in_boundry)) { rstrm->fbtbc = 0; return (TRUE); } return (FALSE); } while (rstrm->fbtbc > 0 || (!rstrm->last_frag)) { if (!skip_input_bytes(rstrm, rstrm->fbtbc)) return (FALSE); rstrm->fbtbc = 0; if ((!rstrm->last_frag) && (!set_input_fragment(rstrm))) return (FALSE); } rstrm->last_frag = FALSE; return (TRUE); }
static bool /* must manage buffers, fragments, and records */ xdr_inrec_getbytes(XDR *xdrs, char *addr, u_int len) { RECSTREAM *rstrm = (RECSTREAM *)(xdrs->x_private); int current; while (len > 0) { current = (int)rstrm->fbtbc; if (current == 0) { if (rstrm->last_frag) return (FALSE); if (! set_input_fragment(rstrm, INT_MAX)) return (FALSE); continue; } current = (len < current) ? len : current; if (! get_input_bytes(rstrm, addr, current, INT_MAX)) return (FALSE); addr += current; rstrm->fbtbc -= current; len -= current; /* handle checksumming if requested */ if (xdrs->x_flags & XDR_FLAG_CKSUM) { if (rstrm->cklen) { if (! (rstrm->cksum)) { if (rstrm->offset >= rstrm->cklen) { compute_buffer_cksum(rstrm); } } } } } return (TRUE); }
/* * This is just like the ops vector x_getbytes(), except that * instead of returning success or failure on getting a certain number * of bytes, it behaves much more like the read() system call against a * pipe -- it returns up to the number of bytes requested and a return of * zero indicates end-of-record. A -1 means something very bad happened. */ XDR_API u_int /* must manage buffers, fragments, and records */ xdrrec_readbytes(XDR *xdrs, caddr_t addr, u_int l) { /* LINTED pointer cast */ RECSTREAM *rstrm = (RECSTREAM *)(xdrs->x_private); int current, len; len = l; while (len > 0) { current = rstrm->fbtbc; if (current == 0) { if (rstrm->last_frag) return (l - len); if (!set_input_fragment(rstrm)) return ((u_int)-1); continue; } current = (len < current) ? len : current; if (!get_input_bytes(rstrm, addr, current, FALSE)) return ((u_int)-1); addr += current; rstrm->fbtbc -= current; len -= current; } return (l - len); }
static bool_t xdrrec_control(XDR *xdrs, int request, void *info) { /* LINTED pointer cast */ RECSTREAM *rstrm = (RECSTREAM *)(xdrs->x_private); xdr_bytesrec *xptr; switch (request) { case XDR_GET_BYTES_AVAIL: /* Check if at end of fragment and not last fragment */ if ((rstrm->fbtbc == 0) && (!rstrm->last_frag)) if (!set_input_fragment(rstrm)) { return (FALSE); }; xptr = (xdr_bytesrec *)info; xptr->xc_is_last_record = rstrm->last_frag; xptr->xc_num_avail = rstrm->fbtbc; return (TRUE); default: return (FALSE); } }
static bool_t /* must manage buffers, fragments, and records */ xdrrec_getbytes( XDR *xdrs, register char* addr, register unsigned len) { register RECSTREAM *rstrm = (RECSTREAM *)(xdrs->x_private); register int current; while (len != 0) { current = (int)rstrm->fbtbc; if (current == 0) { if (rstrm->last_frag) return (FALSE); if (! set_input_fragment(rstrm)) return (FALSE); continue; } current = (len < current) ? (int)len : current; if (! get_input_bytes(rstrm, addr, current)) return (FALSE); addr += current; rstrm->fbtbc -= current; len -= current; } return (TRUE); }
/* * Before reading (deserializing from the stream, one should always call * this procedure to guarantee proper record alignment. */ bool_t xdrrec_skiprecord(XDR *xdrs) { register RECSTREAM *rstrm = (RECSTREAM *)(xdrs->x_private); while (rstrm->fbtbc > 0 || (! rstrm->last_frag)) { if (! skip_input_bytes(rstrm, rstrm->fbtbc)) return (FALSE); rstrm->fbtbc = 0; if ((! rstrm->last_frag) && (! set_input_fragment(rstrm))) return (FALSE); } rstrm->last_frag = FALSE; return (TRUE); }
/* * Look ahead function. * Returns TRUE iff there is no more input in the buffer * after consuming the rest of the current record. */ bool_t xdrrec_eof(XDR *xdrs) { RECSTREAM *rstrm = (RECSTREAM *)(xdrs->x_private); while (rstrm->fbtbc > 0 || (! rstrm->last_frag)) { if (! skip_input_bytes(rstrm, rstrm->fbtbc)) return (TRUE); rstrm->fbtbc = 0; if ((! rstrm->last_frag) && (! set_input_fragment(rstrm))) return (TRUE); } if (rstrm->in_finger == rstrm->in_boundry) return (TRUE); return (FALSE); }
/* * Before reading (deserializing from the stream), one should always call * this procedure to guarantee proper record alignment. */ bool xdr_inrec_skiprecord(XDR *xdrs) { RECSTREAM *rstrm = (RECSTREAM *)(xdrs->x_private); while (rstrm->fbtbc > 0 || (! rstrm->last_frag)) { if (! skip_input_bytes(rstrm, rstrm->fbtbc)) return (FALSE); rstrm->fbtbc = 0; if ((! rstrm->last_frag) && (! set_input_fragment(rstrm, INT_MAX))) return (FALSE); } rstrm->last_frag = FALSE; rstrm->offset = 0; rstrm->cksum = 0; return (TRUE); }
bool xdr_inrec_readahead(XDR *xdrs, u_int maxfraglen) { RECSTREAM *rstrm; int current; rstrm = (RECSTREAM *)xdrs->x_private; current = (int)rstrm->fbtbc; if (current == 0) { if (rstrm->last_frag) { return (FALSE); } if (! set_input_fragment(rstrm, maxfraglen)) return (FALSE); } return (TRUE); }
/* * Look ahead fuction. * Returns TRUE iff there is no more input in the buffer * after consuming the rest of the current record. */ XDR_API bool_t xdrrec_eof(XDR *xdrs) { /* LINTED pointer cast */ RECSTREAM *rstrm = (RECSTREAM *)(xdrs->x_private); if (rstrm->in_nonblock) { /* * If in_needpoll is true, the non-blocking XDR stream * does not have a complete record. */ return (rstrm->in_needpoll); } while (rstrm->fbtbc > 0 || (!rstrm->last_frag)) { if (!skip_input_bytes(rstrm, rstrm->fbtbc)) return (TRUE); rstrm->fbtbc = 0; if ((!rstrm->last_frag) && (!set_input_fragment(rstrm))) return (TRUE); } if (rstrm->in_finger == rstrm->in_boundry) return (TRUE); return (FALSE); }
static bool /* must manage buffers, fragments, and records */ xdrrec_getbytes(XDR *xdrs, char *addr, u_int len) { RECSTREAM *rstrm = (RECSTREAM *) (xdrs->x_private); int current; while (len > 0) { current = (int)rstrm->fbtbc; if (current == 0) { if (rstrm->last_frag) return (false); if (!set_input_fragment(rstrm)) return (false); continue; } current = (len < current) ? len : current; if (!get_input_bytes(rstrm, addr, current)) return (false); addr += current; rstrm->fbtbc -= current; len -= current; } return (true); }