#include <string.h>
#include <unistd.h>
#include <errno.h>
-#include "zassert.h"
+#include <assert.h>
#include "zbuf.h"
#include "memory.h"
#include "nhrpd.h"
#define ERRNO_IO_RETRY(EN) (((EN) == EAGAIN) || ((EN) == EWOULDBLOCK) || ((EN) == EINTR))
-DEFINE_MTYPE_STATIC(NHRPD, ZBUF_DATA, "NHRPD zbuf data")
+DEFINE_MTYPE_STATIC(NHRPD, ZBUF_DATA, "NHRPD zbuf data");
struct zbuf *zbuf_alloc(size_t size)
{
struct zbuf *zb;
- zb = XMALLOC(MTYPE_ZBUF_DATA, sizeof(*zb) + size);
+ zb = XCALLOC(MTYPE_ZBUF_DATA, sizeof(*zb) + size);
zbuf_init(zb, zb + 1, size, 0);
zb->allocated = 1;
void zbuf_reset_head(struct zbuf *zb, void *ptr)
{
- zassert((void *)zb->buf <= ptr && ptr <= (void *)zb->tail);
+ assert((void *)zb->buf <= ptr && ptr <= (void *)zb->tail);
zb->head = ptr;
}
void zbufq_init(struct zbuf_queue *zbq)
{
*zbq = (struct zbuf_queue){
- .queue_head = LIST_INITIALIZER(zbq->queue_head),
+ .queue_head = INIT_DLIST(zbq->queue_head),
};
}
void zbufq_reset(struct zbuf_queue *zbq)
{
- struct zbuf *buf, *bufn;
+ struct zbuf *buf;
- list_for_each_entry_safe(buf, bufn, &zbq->queue_head, queue_list)
- {
- list_del(&buf->queue_list);
+ frr_each_safe (zbuf_queue, &zbq->queue_head, buf) {
+ zbuf_queue_del(&zbq->queue_head, buf);
zbuf_free(buf);
}
}
void zbufq_queue(struct zbuf_queue *zbq, struct zbuf *zb)
{
- list_add_tail(&zb->queue_list, &zbq->queue_head);
+ zbuf_queue_add_tail(&zbq->queue_head, zb);
}
int zbufq_write(struct zbuf_queue *zbq, int fd)
{
struct iovec iov[16];
- struct zbuf *zb, *zbn;
+ struct zbuf *zb;
ssize_t r;
size_t iovcnt = 0;
- list_for_each_entry_safe(zb, zbn, &zbq->queue_head, queue_list)
- {
+ frr_each_safe (zbuf_queue, &zbq->queue_head, zb) {
iov[iovcnt++] = (struct iovec){
.iov_base = zb->head, .iov_len = zbuf_used(zb),
};
if (r < 0)
return r;
- list_for_each_entry_safe(zb, zbn, &zbq->queue_head, queue_list)
- {
+ frr_each_safe (zbuf_queue, &zbq->queue_head, zb) {
if (r < (ssize_t)zbuf_used(zb)) {
zb->head += r;
return 1;
}
r -= zbuf_used(zb);
- list_del(&zb->queue_list);
+ zbuf_queue_del(&zbq->queue_head, zb);
zbuf_free(zb);
}
return;
memcpy(dst, src, len);
}
+
+void zbuf_copy_peek(struct zbuf *zdst, struct zbuf *zsrc, size_t len)
+{
+ const void *src;
+ void *dst;
+
+ dst = zbuf_pushn(zdst, len);
+ src = zbuf_pulln(zsrc, 0);
+ if (!dst || !src)
+ return;
+ memcpy(dst, src, len);
+}