/* * Make sure there is enough space in front of the data for * len bytes, and update the read pointer. */ int uni_msg_prepend(struct uni_msg *msg, size_t len) { size_t need; if (uni_msg_leading(msg) >= len) { msg->b_rptr -= len; return (0); } need = len - uni_msg_leading(msg); if (uni_msg_ensure(msg, need)) return (-1); memcpy(msg->b_rptr + need, msg->b_rptr, uni_msg_len(msg)); msg->b_rptr += need - len; msg->b_wptr += need; return (0); }
/* * Extend message by at least 's' additional bytes. * May reallocate the message buffer. Return -1 on errors, 0 if ok. * If an error occurs the message is destroyed. */ int uni_msg_extend(struct uni_msg *m, size_t s) { u_char *b; size_t len, leading, newsize; len = uni_msg_len(m); newsize = m->b_wptr - m->b_buf + s + EXTRA; leading = m->b_rptr - m->b_buf; if ((b = realloc(m->b_buf, newsize)) == NULL) { free(m->b_buf); free(m); return (-1); } m->b_buf = b; m->b_rptr = m->b_buf + leading; m->b_wptr = m->b_rptr + len; m->b_lim = m->b_buf + newsize; return (0); }