]> git.proxmox.com Git - mirror_frr.git/blobdiff - nhrpd/zbuf.c
Merge pull request #9906 from patrasar/2553196
[mirror_frr.git] / nhrpd / zbuf.c
index 7f1475cc69e1a2eb19f49e73f27534951b2c92fb..9cc2b56245ca4dd9a5405cba509bdaeb18090d8f 100644 (file)
 #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;
@@ -59,7 +59,7 @@ void zbuf_reset(struct zbuf *zb)
 
 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;
 }
 
@@ -164,35 +164,33 @@ void *zbuf_may_pull_until(struct zbuf *zb, const char *sep, struct zbuf *msg)
 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),
                };
@@ -204,15 +202,14 @@ int zbufq_write(struct zbuf_queue *zbq, int fd)
        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);
        }
 
@@ -230,3 +227,15 @@ void zbuf_copy(struct zbuf *zdst, struct zbuf *zsrc, size_t len)
                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);
+}