add m_append utility function to be used in forthcoming changes
This commit is contained in:
parent
3518d22073
commit
4873d1754f
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=138541
@ -933,6 +933,52 @@ out: if (((m = m0)->m_flags & M_PKTHDR) && (m->m_pkthdr.len < totlen))
|
||||
m->m_pkthdr.len = totlen;
|
||||
}
|
||||
|
||||
/*
|
||||
* Append the specified data to the indicated mbuf chain,
|
||||
* Extend the mbuf chain if the new data does not fit in
|
||||
* existing space.
|
||||
*
|
||||
* Return 1 if able to complete the job; otherwise 0.
|
||||
*/
|
||||
int
|
||||
m_append(struct mbuf *m0, int len, c_caddr_t cp)
|
||||
{
|
||||
struct mbuf *m, *n;
|
||||
int remainder, space;
|
||||
|
||||
for (m = m0; m->m_next != NULL; m = m->m_next)
|
||||
;
|
||||
remainder = len;
|
||||
space = M_TRAILINGSPACE(m);
|
||||
if (space > 0) {
|
||||
/*
|
||||
* Copy into available space.
|
||||
*/
|
||||
if (space > remainder)
|
||||
space = remainder;
|
||||
bcopy(cp, mtod(m, caddr_t) + m->m_len, space);
|
||||
m->m_len += space;
|
||||
cp += space, remainder -= space;
|
||||
}
|
||||
while (remainder > 0) {
|
||||
/*
|
||||
* Allocate a new mbuf; could check space
|
||||
* and allocate a cluster instead.
|
||||
*/
|
||||
n = m_get(M_DONTWAIT, m->m_type);
|
||||
if (n == NULL)
|
||||
break;
|
||||
n->m_len = min(MLEN, remainder);
|
||||
bcopy(cp, mtod(m, caddr_t), m->m_len);
|
||||
cp += m->m_len, remainder -= m->m_len;
|
||||
m->m_next = n;
|
||||
m = n;
|
||||
}
|
||||
if (m0->m_flags & M_PKTHDR)
|
||||
m0->m_pkthdr.len += len - remainder;
|
||||
return (remainder == 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Apply function f to the data in an mbuf chain starting "off" bytes from
|
||||
* the beginning, continuing for "len" bytes.
|
||||
|
@ -535,6 +535,7 @@ struct uio;
|
||||
void m_adj(struct mbuf *, int);
|
||||
int m_apply(struct mbuf *, int, int,
|
||||
int (*)(void *, void *, u_int), void *);
|
||||
int m_append(struct mbuf *, int, c_caddr_t);
|
||||
void m_cat(struct mbuf *, struct mbuf *);
|
||||
void m_extadd(struct mbuf *, caddr_t, u_int,
|
||||
void (*)(void *, void *), void *, int, int);
|
||||
|
Loading…
Reference in New Issue
Block a user