Deleted Added
full compact
38c38
< __FBSDID("$FreeBSD: head/lib/libc/xdr/xdr_rec.c 95658 2002-04-28 15:18:50Z des $");
---
> __FBSDID("$FreeBSD: head/lib/libc/xdr/xdr_rec.c 109359 2003-01-16 07:13:51Z mbr $");
68a69,72
> #include <rpc/auth.h>
> #include <rpc/svc.h>
> #include <rpc/clnt.h>
> #include <sys/stddef.h>
94c98
< * A record fragment is a two-byte header followed by zero to
---
> * A record fragment is a four-byte header followed by zero to
109d112
< char *the_buffer;
130a134,142
>
> bool_t nonblock;
> bool_t in_haveheader;
> u_int32_t in_header;
> char *in_hdrp;
> int in_hdrlen;
> int in_reclen;
> int in_received;
> int in_maxrec;
138a151
> static bool_t realloc_stream(RECSTREAM *, int);
171,173d183
< /*
< * adjust sizes and allocate buffer quad byte aligned
< */
174a185,190
> rstrm->out_base = mem_alloc(rstrm->sendsize);
> if (rstrm->out_base == NULL) {
> warnx("xdrrec_create: out of memory");
> mem_free(rstrm, sizeof(RECSTREAM));
> return;
> }
176,177c192,193
< rstrm->the_buffer = mem_alloc(sendsize + recvsize + BYTES_PER_XDR_UNIT);
< if (rstrm->the_buffer == NULL) {
---
> rstrm->in_base = mem_alloc(recvsize);
> if (rstrm->in_base == NULL) {
178a195,196
> mem_free(rstrm->out_base, sendsize);
> mem_free(rstrm, sizeof(RECSTREAM));
181,184d198
< for (rstrm->out_base = rstrm->the_buffer;
< (u_long)rstrm->out_base % BYTES_PER_XDR_UNIT != 0;
< rstrm->out_base++);
< rstrm->in_base = rstrm->out_base + sendsize;
202a217,222
> rstrm->in_haveheader = FALSE;
> rstrm->in_hdrlen = 0;
> rstrm->in_hdrp = (char *)(void *)&rstrm->in_header;
> rstrm->nonblock = FALSE;
> rstrm->in_reclen = 0;
> rstrm->in_received = 0;
416,417c436,437
< mem_free(rstrm->the_buffer,
< rstrm->sendsize + rstrm->recvsize + BYTES_PER_XDR_UNIT);
---
> mem_free(rstrm->out_base, rstrm->sendsize);
> mem_free(rstrm->in_base, rstrm->recvsize);
434a455
> enum xprt_stat xstat;
435a457,469
> 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;
> }
>
456a491
> enum xprt_stat xstat;
457a493,500
> if (rstrm->nonblock) {
> if (__xdrrec_getrec(xdrs, &xstat, FALSE))
> return FALSE;
> if (!rstrm->in_haveheader && xstat == XPRT_IDLE)
> return TRUE;
> return FALSE;
> }
>
497a541,553
> /*
> * Fill the stream buffer with a record for a non-blocking connection.
> * Return true if a record is available in the buffer, false if not.
> */
> bool_t
> __xdrrec_getrec(xdrs, statp, expectdata)
> XDR *xdrs;
> enum xprt_stat *statp;
> bool_t expectdata;
> {
> RECSTREAM *rstrm = (RECSTREAM *)(xdrs->x_private);
> ssize_t n;
> int fraglen;
498a555,634
> if (!rstrm->in_haveheader) {
> n = rstrm->readit(rstrm->tcp_handle, rstrm->in_hdrp,
> (int)sizeof (rstrm->in_header) - rstrm->in_hdrlen);
> if (n == 0) {
> *statp = expectdata ? XPRT_DIED : XPRT_IDLE;
> return FALSE;
> }
> if (n < 0) {
> *statp = XPRT_DIED;
> return FALSE;
> }
> rstrm->in_hdrp += n;
> rstrm->in_hdrlen += n;
> if (rstrm->in_hdrlen < sizeof (rstrm->in_header)) {
> *statp = XPRT_MOREREQS;
> return FALSE;
> }
> rstrm->in_header = ntohl(rstrm->in_header);
> fraglen = (int)(rstrm->in_header & ~LAST_FRAG);
> if (fraglen == 0 || fraglen > rstrm->in_maxrec ||
> (rstrm->in_reclen + fraglen) > rstrm->in_maxrec) {
> *statp = XPRT_DIED;
> return FALSE;
> }
> rstrm->in_reclen += fraglen;
> if (rstrm->in_reclen > rstrm->recvsize)
> realloc_stream(rstrm, rstrm->in_reclen);
> if (rstrm->in_header & LAST_FRAG) {
> rstrm->in_header &= ~LAST_FRAG;
> rstrm->last_frag = TRUE;
> }
> }
>
> n = rstrm->readit(rstrm->tcp_handle,
> rstrm->in_base + rstrm->in_received,
> (rstrm->in_reclen - rstrm->in_received));
>
> if (n < 0) {
> *statp = XPRT_DIED;
> return FALSE;
> }
>
> if (n == 0) {
> *statp = expectdata ? XPRT_DIED : XPRT_IDLE;
> return FALSE;
> }
>
> rstrm->in_received += n;
>
> if (rstrm->in_received == rstrm->in_reclen) {
> rstrm->in_haveheader = FALSE;
> rstrm->in_hdrp = (char *)(void *)&rstrm->in_header;
> rstrm->in_hdrlen = 0;
> if (rstrm->last_frag) {
> rstrm->fbtbc = rstrm->in_reclen;
> rstrm->in_boundry = rstrm->in_base + rstrm->in_reclen;
> rstrm->in_finger = rstrm->in_base;
> *statp = XPRT_MOREREQS;
> return TRUE;
> }
> }
>
> *statp = XPRT_MOREREQS;
> return FALSE;
> }
>
> bool_t
> __xdrrec_setnonblock(xdrs, maxrec)
> XDR *xdrs;
> int maxrec;
> {
> RECSTREAM *rstrm = (RECSTREAM *)(xdrs->x_private);
>
> rstrm->nonblock = TRUE;
> if (maxrec == 0)
> maxrec = rstrm->recvsize;
> rstrm->in_maxrec = maxrec;
> return TRUE;
> }
>
529a666,668
> if (rstrm->nonblock)
> return FALSE;
>
621a761,786
>
> /*
> * Reallocate the input buffer for a non-block stream.
> */
> static bool_t
> realloc_stream(rstrm, size)
> RECSTREAM *rstrm;
> int size;
> {
> ptrdiff_t diff;
> char *buf;
>
> if (size > rstrm->recvsize) {
> buf = realloc(rstrm->in_base, (size_t)size);
> if (buf == NULL)
> return FALSE;
> diff = buf - rstrm->in_base;
> rstrm->in_finger += diff;
> rstrm->in_base = buf;
> rstrm->in_boundry = buf + size;
> rstrm->recvsize = size;
> rstrm->in_size = size;
> }
>
> return TRUE;
> }