summaryrefslogtreecommitdiffstats
path: root/sys/kern/uipc_mbuf.c
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>1994-10-04 06:50:01 +0000
committerphk <phk@FreeBSD.org>1994-10-04 06:50:01 +0000
commit094a6feedc9c9beeaa55745a0434c55bacd5f61d (patch)
treefe71b26b2475a73e30a40ef9d2bb85155fbbc986 /sys/kern/uipc_mbuf.c
parent56f4ab7d4cddd64b1926f18e74920934085c6675 (diff)
downloadFreeBSD-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.c55
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;
+}
OpenPOWER on IntegriCloud