+ /*
+ * If the MSG_WAITALL flag is set (for non-atomic socket),
+ * we must not quit until "resid == 0" or an error
+ * termination. If a signal/timeout occurs, return
+ * prematurely but without error.
+ * Keep sockbuf locked against other readers.
+ */
+ while (flags & MSG_WAITALL && m == 0 && resid > 0 &&
+ !sosendallatonce(so)) {
+ error = sbwait(&so->so_rcv);
+ if (error) {
+ sbunlock(&so->so_rcv);
+ splx(s);
+ if (mp)
+ *mp = (struct mbuf *)0;
+ return (0);
+ }
+ if (m = so->so_rcv.sb_mb)
+ nextrecord = m->m_nextpkt;
+ if (so->so_error || so->so_state & SS_CANTRCVMORE)
+ break;
+ continue;
+ }