int mb_get_mem(struct mbdata *mbp, char * target, size_t size) { struct mbuf *m = mbp->mb_cur; u_int count; while (size > 0) { if (m == NULL) { MBERROR(("incomplete copy\n")); #ifndef EBADRPC return EINVAL; #else return EBADRPC; #endif } count = mb_left(m, mbp->mb_pos); if (count == 0) { mbp->mb_cur = m = m->m_next; if (m) mbp->mb_pos = mtod(m, char *); continue; } if (count > size) count = size; size -= count; if (target) { if (count == 1) { *target++ = *mbp->mb_pos; } else { bcopy(mbp->mb_pos, target, count); target += count; } } mbp->mb_pos += count; }
int md_get_mem(struct mdchain *mdp, void *targetv, int size, int type) { char *target = targetv; struct mbuf *m = mdp->md_cur; int error; u_int count; u_char *s; while (size > 0) { if (m == NULL) { #ifdef MCHAIN_DEBUG MBERROR(("incomplete copy\n")); #endif return EBADRPC; } s = mdp->md_pos; count = mtod(m, u_char*) + m->m_len - s; if (count == 0) { mdp->md_cur = m = m->m_next; if (m) s = mdp->md_pos = mtod(m, void *); continue; } if (count > size) count = size; size -= count; mdp->md_pos += count; if (target == NULL) continue; switch (type) { case MB_MUSER: error = copyout(s, target, count); if (error) return error; break; case MB_MSYSTEM: bcopy(s, target, count); break; case MB_MINLINE: while (count--) *target++ = *s++; continue; } target += count; }
int md_get_mem(struct mdchain *mdp, caddr_t target, int size, int type) { struct mbuf *m = mdp->md_cur; int error; u_int count; u_char *s; while (size > 0) { if (m == NULL) { MBERROR("incomplete copy\n"); return (EBADRPC); } s = mdp->md_pos; count = mtod(m, u_char*) + m->m_len - s; if (count == 0) { mdp->md_cur = m = m->m_next; if (m) s = mdp->md_pos = mtod(m, caddr_t); continue; } if (count > size) count = size; size -= count; mdp->md_pos += count; if (target == NULL) continue; switch (type) { case MB_MUSER: error = copyout(s, target, count); if (error) return error; break; case MB_MSYSTEM: bcopy(s, target, count); break; case MB_MINLINE: while (count--) *target++ = *s++; continue; } target += count; } return (0); }