diff options
author | phk <phk@FreeBSD.org> | 1994-10-04 06:50:01 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 1994-10-04 06:50:01 +0000 |
commit | 094a6feedc9c9beeaa55745a0434c55bacd5f61d (patch) | |
tree | fe71b26b2475a73e30a40ef9d2bb85155fbbc986 /sys/kern/uipc_mbuf.c | |
parent | 56f4ab7d4cddd64b1926f18e74920934085c6675 (diff) | |
download | FreeBSD-src-094a6feedc9c9beeaa55745a0434c55bacd5f61d.zip FreeBSD-src-094a6feedc9c9beeaa55745a0434c55bacd5f61d.tar.gz |
Moved m_copyback into uipc_mbuf.c
Diffstat (limited to 'sys/kern/uipc_mbuf.c')
-rw-r--r-- | sys/kern/uipc_mbuf.c | 55 |
1 files changed, 54 insertions, 1 deletions
diff --git a/sys/kern/uipc_mbuf.c b/sys/kern/uipc_mbuf.c index 0b35abb..62a648c 100644 --- a/sys/kern/uipc_mbuf.c +++ b/sys/kern/uipc_mbuf.c @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * @(#)uipc_mbuf.c 8.2 (Berkeley) 1/4/94 - * $Id: uipc_mbuf.c,v 1.3 1994/08/02 07:43:02 davidg Exp $ + * $Id: uipc_mbuf.c,v 1.4 1994/10/02 17:35:31 phk Exp $ */ #include <sys/param.h> @@ -661,3 +661,56 @@ m_devget(buf, totlen, off0, ifp, copy) } return (top); } + +/* + * Copy data from a buffer back into the indicated mbuf chain, + * starting "off" bytes from the beginning, extending the mbuf + * chain if necessary. + */ +void +m_copyback(m0, off, len, cp) + struct mbuf *m0; + register int off; + register int len; + caddr_t cp; +{ + register int mlen; + register struct mbuf *m = m0, *n; + int totlen = 0; + + if (m0 == 0) + return; + while (off > (mlen = m->m_len)) { + off -= mlen; + totlen += mlen; + if (m->m_next == 0) { + n = m_getclr(M_DONTWAIT, m->m_type); + if (n == 0) + goto out; + n->m_len = min(MLEN, len + off); + m->m_next = n; + } + m = m->m_next; + } + while (len > 0) { + mlen = min (m->m_len - off, len); + bcopy(cp, off + mtod(m, caddr_t), (unsigned)mlen); + cp += mlen; + len -= mlen; + mlen += off; + off = 0; + totlen += mlen; + if (len == 0) + break; + if (m->m_next == 0) { + n = m_get(M_DONTWAIT, m->m_type); + if (n == 0) + break; + n->m_len = min(MLEN, len); + m->m_next = n; + } + m = m->m_next; + } +out: if (((m = m0)->m_flags & M_PKTHDR) && (m->m_pkthdr.len < totlen)) + m->m_pkthdr.len = totlen; +} |