int mb_put_mem(struct mbdata *mbp, const char *source, size_t size) { struct mbuf *m; char * dst; size_t cplen; int error; if (size == 0) return 0; m = mbp->mb_cur; if ((error = m_getm(m, size, &m)) != 0) return error; while (size > 0) { cplen = M_TRAILINGSPACE(m); if (cplen == 0) { m = m->m_next; continue; } if (cplen > size) cplen = size; dst = mtod(m, char *) + m->m_len; if (source) { bcopy(source, dst, cplen); source += cplen; } else bzero(dst, cplen); size -= cplen; m->m_len += cplen; mbp->mb_count += cplen; } mbp->mb_pos = mtod(m, char *) + m->m_len; mbp->mb_cur = m; return 0; }
int smb_rq_dmem(struct mbdata *mbp, char *src, size_t size) { struct mbuf *m; char * dst; int cplen, error; if (size == 0) return 0; m = mbp->mb_cur; if ((error = m_getm(m, size, &m)) != 0) return error; while (size > 0) { cplen = M_TRAILINGSPACE(m); if (cplen == 0) { m = m->m_next; continue; } if (cplen > (int)size) cplen = size; dst = mtod(m, char *) + m->m_len; nls_mem_toext(dst, src, cplen); size -= cplen; src += cplen; m->m_len += cplen; mbp->mb_count += cplen; } mbp->mb_pos = mtod(m, char *) + m->m_len; mbp->mb_cur = m; return 0; }
int mb_put_mem(struct mbchain *mbp, c_caddr_t source, int size, int type) { struct mbuf *m; caddr_t dst; c_caddr_t src; int cplen, error, mleft, count; size_t srclen, dstlen; m = mbp->mb_cur; mleft = mbp->mb_mleft; while (size > 0) { if (mleft == 0) { if (m->m_next == NULL) m = m_getm(m, size, M_WAIT, MT_DATA); else m = m->m_next; mleft = M_TRAILINGSPACE(m); continue; } cplen = mleft > size ? size : mleft; srclen = dstlen = cplen; dst = mtod(m, caddr_t) + m->m_len; switch (type) { case MB_MCUSTOM: srclen = size; dstlen = mleft; error = mbp->mb_copy(mbp, source, dst, &srclen, &dstlen); if (error) return error; break; case MB_MINLINE: for (src = source, count = cplen; count; count--) *dst++ = *src++; break; case MB_MSYSTEM: bcopy(source, dst, cplen); break; case MB_MUSER: error = copyin(source, dst, cplen); if (error) return error; break; case MB_MZERO: bzero(dst, cplen); break; } size -= srclen; source += srclen; m->m_len += dstlen; mleft -= dstlen; mbp->mb_count += dstlen; } mbp->mb_cur = m; mbp->mb_mleft = mleft; return 0; }
int mb_put_mem(struct mbchain *mbp, const char *source, size_t size, int type) { struct mbuf *m; char *dst; const char *src; int error; size_t cplen, mleft, count; m = mbp->mb_cur; mleft = mbp->mb_mleft; while (size > 0) { if (mleft == 0) { if (m->m_next == NULL) { m = m_getm(m, size, M_WAIT, MT_DATA); if (m == NULL) return ENOBUFS; } m = m->m_next; mleft = M_TRAILINGSPACE(m); continue; } cplen = mleft > size ? size : mleft; dst = mtod(m, char *) + m->m_len; switch (type) { case MB_MCUSTOM: error = mbp->mb_copy(mbp, source, dst, cplen); if (error) return error; break; case MB_MINLINE: for (src = source, count = cplen; count; count--) *dst++ = *src++; break; case MB_MSYSTEM: memcpy(dst, source, cplen); break; case MB_MUSER: error = copyin(source, dst, cplen); if (error) return error; break; case MB_MZERO: memset(dst, 0, cplen); break; } size -= cplen; source += cplen; m->m_len += cplen; mleft -= cplen; mbp->mb_count += cplen; } mbp->mb_cur = m; mbp->mb_mleft = mleft; return 0; }