- if (slp->ns_reclen == 0) {
- if (slp->ns_cc < NFSX_UNSIGNED) {
- slp->ns_flag &= ~SLP_GETSTREAM;
- return (0);
- }
- m = slp->ns_raw;
- mdata = mbuf_data(m);
- mlen = mbuf_len(m);
- if (mlen >= NFSX_UNSIGNED) {
- bcopy(mdata, (caddr_t)&recmark, NFSX_UNSIGNED);
- mdata += NFSX_UNSIGNED;
- mlen -= NFSX_UNSIGNED;
- mbuf_setdata(m, mdata, mlen);
- } else {
- cp1 = (caddr_t)&recmark;
- cp2 = mdata;
- while (cp1 < ((caddr_t)&recmark) + NFSX_UNSIGNED) {
- while (mlen == 0) {
- m = mbuf_next(m);
- cp2 = mbuf_data(m);
- mlen = mbuf_len(m);
- }
- *cp1++ = *cp2++;
- mlen--;
- mbuf_setdata(m, cp2, mlen);
- }
- }
- slp->ns_cc -= NFSX_UNSIGNED;
- recmark = ntohl(recmark);
- slp->ns_reclen = recmark & ~0x80000000;
- if (recmark & 0x80000000)
- slp->ns_flag |= SLP_LASTFRAG;
- else
- slp->ns_flag &= ~SLP_LASTFRAG;
- if (slp->ns_reclen <= 0 || slp->ns_reclen > NFS_MAXPACKET) {
- slp->ns_flag &= ~SLP_GETSTREAM;
- return (EPERM);
- }
- }
-
- /*
- * Now get the record part.
- *
- * Note that slp->ns_reclen may be 0. Linux sometimes
- * generates 0-length RPCs
- */
- recm = NULL;
- if (slp->ns_cc == slp->ns_reclen) {
- recm = slp->ns_raw;
- slp->ns_raw = slp->ns_rawend = NULL;
- slp->ns_cc = slp->ns_reclen = 0;
- } else if (slp->ns_cc > slp->ns_reclen) {
- len = 0;
- m = slp->ns_raw;
- mlen = mbuf_len(m);
- mdata = mbuf_data(m);
- om = NULL;
- while (len < slp->ns_reclen) {
- if ((len + mlen) > slp->ns_reclen) {
- if (mbuf_copym(m, 0, slp->ns_reclen - len, waitflag, &m2)) {
- slp->ns_flag &= ~SLP_GETSTREAM;
- return (EWOULDBLOCK);
+ if (slp->ns_reclen == 0) {
+ if (slp->ns_cc < NFSX_UNSIGNED) {
+ slp->ns_flag &= ~SLP_GETSTREAM;
+ return 0;
+ }
+ m = slp->ns_raw;
+ mdata = mbuf_data(m);
+ mlen = mbuf_len(m);
+ if (mlen >= NFSX_UNSIGNED) {
+ bcopy(mdata, (caddr_t)&recmark, NFSX_UNSIGNED);
+ mdata += NFSX_UNSIGNED;
+ mlen -= NFSX_UNSIGNED;
+ mbuf_setdata(m, mdata, mlen);
+ } else {
+ cp1 = (caddr_t)&recmark;
+ cp2 = mdata;
+ while (cp1 < ((caddr_t)&recmark) + NFSX_UNSIGNED) {
+ while (mlen == 0) {
+ m = mbuf_next(m);
+ cp2 = mbuf_data(m);
+ mlen = mbuf_len(m);
+ }
+ *cp1++ = *cp2++;
+ mlen--;
+ mbuf_setdata(m, cp2, mlen);