- m->m_off = MMINOFF;
- len = MIN(MLEN, u.u_count);
- }
- iomove(mtod(m, caddr_t), len, B_WRITE);
- m->m_len = len;
- *mp = m;
- mp = &m->m_next;
- space = sbspace(&so->so_snd);
- }
- s = splnet();
- goto again;
+ len = min(min(mlen, uio->uio_resid), space);
+ space -= len;
+ /*
+ * For datagram protocols, leave room
+ * for protocol headers in first mbuf.
+ */
+ if (atomic && top == 0 && len < mlen)
+ MH_ALIGN(m, len);
+ }
+ error = uiomove(mtod(m, caddr_t), len, uio);
+ m->m_len = len;
+ *mp = m;
+ top->m_pkthdr.len += len;
+ if (error)
+ goto release;
+ mp = &m->m_next;
+ if (uio->uio_resid <= 0) {
+ if ((flags & MSG_EOR) && top)
+ top->m_flags |= M_EOR;
+ break;
+ }
+ } while (space > 0 && atomic);
+ if (dontroute)
+ so->so_options |= SO_DONTROUTE;
+ s = splnet(); /* XXX */
+ error = (*so->so_proto->pr_usrreq)(so,
+ (flags & MSG_OOB) ? PRU_SENDOOB : PRU_SEND,
+ top, (caddr_t)nam, rights, control);
+ splx(s);
+ if (dontroute)
+ so->so_options &= ~SO_DONTROUTE;
+ rights = 0;
+ rlen = 0;
+ top = 0;
+ mp = ⊤
+ first = 0;
+ if (error)
+ goto release;
+ } while (uio->uio_resid && space > 0);
+ } while (uio->uio_resid);