+ int len;
+ int eor, s, error = 0, moff, tomark;
+
+ if (flags & SOF_OOB) {
+ m = m_get(M_WAIT, MT_DATA);
+ error = (*so->so_proto->pr_usrreq)(so, PRU_RCVOOB,
+ m, (struct mbuf *)0, (struct socketopt *)0);
+ if (error)
+ return (error);
+ len = uio->uio_resid;
+ do {
+ if (len > m->m_len)
+ len = m->m_len;
+ error =
+ uiomove(mtod(m, caddr_t), (int)len, UIO_READ, uio);
+ m = m_free(m);
+ } while (uio->uio_resid && error == 0 && m);
+ if (m)
+ m_freem(m);
+ return (error);
+ }