Ejemplo n.º 1
0
/*
 * 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);
}
Ejemplo n.º 2
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);
}