]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/imsg-buffer.c
Merge pull request #8078 from idryzhov/fix-zebra-vni
[mirror_frr.git] / lib / imsg-buffer.c
index a486fc17c18d35329eb245ca2d4a051ba3e3fb03..4d41702707cdba56cd07dd5650d719d5ed84396a 100644 (file)
 
 #include <zebra.h>
 
-#include "openbsd-queue.h"
+#include "queue.h"
 #include "imsg.h"
 
-int    ibuf_realloc(struct ibuf *, size_t);
-void   ibuf_enqueue(struct msgbuf *, struct ibuf *);
-void   ibuf_dequeue(struct msgbuf *, struct ibuf *);
+static int ibuf_realloc(struct ibuf *, size_t);
+static void ibuf_enqueue(struct msgbuf *, struct ibuf *);
+static void ibuf_dequeue(struct msgbuf *, struct ibuf *);
 
-struct ibuf *
-ibuf_open(size_t len)
+struct ibuf *ibuf_open(size_t len)
 {
-       struct ibuf     *buf;
+       struct ibuf *buf;
 
        if ((buf = calloc(1, sizeof(struct ibuf))) == NULL)
-               return (NULL);
+               return NULL;
        if ((buf->buf = malloc(len)) == NULL) {
                free(buf);
-               return (NULL);
+               return NULL;
        }
        buf->size = buf->max = len;
        buf->fd = -1;
@@ -42,16 +41,15 @@ ibuf_open(size_t len)
        return (buf);
 }
 
-struct ibuf *
-ibuf_dynamic(size_t len, size_t max)
+struct ibuf *ibuf_dynamic(size_t len, size_t max)
 {
-       struct ibuf     *buf;
+       struct ibuf *buf;
 
        if (max < len)
-               return (NULL);
+               return NULL;
 
        if ((buf = ibuf_open(len)) == NULL)
-               return (NULL);
+               return NULL;
 
        if (max > 0)
                buf->max = max;
@@ -59,90 +57,82 @@ ibuf_dynamic(size_t len, size_t max)
        return (buf);
 }
 
-int
-ibuf_realloc(struct ibuf *buf, size_t len)
+static int ibuf_realloc(struct ibuf *buf, size_t len)
 {
-       u_char  *b;
+       uint8_t *b;
 
        /* on static buffers max is eq size and so the following fails */
        if (buf->wpos + len > buf->max) {
                errno = ERANGE;
-               return (-1);
+               return -1;
        }
 
        b = realloc(buf->buf, buf->wpos + len);
        if (b == NULL)
-               return (-1);
+               return -1;
        buf->buf = b;
        buf->size = buf->wpos + len;
 
-       return (0);
+       return 0;
 }
 
-int
-ibuf_add(struct ibuf *buf, const void *data, size_t len)
+int ibuf_add(struct ibuf *buf, const void *data, size_t len)
 {
        if (buf->wpos + len > buf->size)
                if (ibuf_realloc(buf, len) == -1)
-                       return (-1);
+                       return -1;
 
        memcpy(buf->buf + buf->wpos, data, len);
        buf->wpos += len;
-       return (0);
+       return 0;
 }
 
-void *
-ibuf_reserve(struct ibuf *buf, size_t len)
+void *ibuf_reserve(struct ibuf *buf, size_t len)
 {
-       void    *b;
+       void *b;
 
        if (buf->wpos + len > buf->size)
                if (ibuf_realloc(buf, len) == -1)
-                       return (NULL);
+                       return NULL;
 
        b = buf->buf + buf->wpos;
        buf->wpos += len;
        return (b);
 }
 
-void *
-ibuf_seek(struct ibuf *buf, size_t pos, size_t len)
+void *ibuf_seek(struct ibuf *buf, size_t pos, size_t len)
 {
        /* only allowed to seek in already written parts */
        if (pos + len > buf->wpos)
-               return (NULL);
+               return NULL;
 
        return (buf->buf + pos);
 }
 
-size_t
-ibuf_size(struct ibuf *buf)
+size_t ibuf_size(struct ibuf *buf)
 {
        return (buf->wpos);
 }
 
-size_t
-ibuf_left(struct ibuf *buf)
+size_t ibuf_left(struct ibuf *buf)
 {
        return (buf->max - buf->wpos);
 }
 
-void
-ibuf_close(struct msgbuf *msgbuf, struct ibuf *buf)
+void ibuf_close(struct msgbuf *msgbuf, struct ibuf *buf)
 {
        ibuf_enqueue(msgbuf, buf);
 }
 
-int
-ibuf_write(struct msgbuf *msgbuf)
+int ibuf_write(struct msgbuf *msgbuf)
 {
-       struct iovec     iov[IOV_MAX];
-       struct ibuf     *buf;
-       unsigned int     i = 0;
-       ssize_t n;
+       struct iovec iov[IOV_MAX];
+       struct ibuf *buf;
+       unsigned int i = 0;
+       ssize_t n;
 
        memset(&iov, 0, sizeof(iov));
-       TAILQ_FOREACH(buf, &msgbuf->bufs, entry) {
+       TAILQ_FOREACH (buf, &msgbuf->bufs, entry) {
                if (i >= IOV_MAX)
                        break;
                iov[i].iov_base = buf->buf + buf->rpos;
@@ -156,21 +146,20 @@ again:
                        goto again;
                if (errno == ENOBUFS)
                        errno = EAGAIN;
-               return (-1);
+               return -1;
        }
 
-       if (n == 0) {                   /* connection closed */
+       if (n == 0) { /* connection closed */
                errno = 0;
-               return (0);
+               return 0;
        }
 
        msgbuf_drain(msgbuf, n);
 
-       return (1);
+       return 1;
 }
 
-void
-ibuf_free(struct ibuf *buf)
+void ibuf_free(struct ibuf *buf)
 {
        if (buf == NULL)
                return;
@@ -178,24 +167,24 @@ ibuf_free(struct ibuf *buf)
        free(buf);
 }
 
-void
-msgbuf_init(struct msgbuf *msgbuf)
+void msgbuf_init(struct msgbuf *msgbuf)
 {
        msgbuf->queued = 0;
        msgbuf->fd = -1;
        TAILQ_INIT(&msgbuf->bufs);
 }
 
-void
-msgbuf_drain(struct msgbuf *msgbuf, size_t n)
+void msgbuf_drain(struct msgbuf *msgbuf, size_t n)
 {
-       struct ibuf     *buf, *next;
+       struct ibuf *buf, *next;
 
        for (buf = TAILQ_FIRST(&msgbuf->bufs); buf != NULL && n > 0;
-           buf = next) {
+            buf = next) {
                next = TAILQ_NEXT(buf, entry);
                if (buf->rpos + n >= buf->wpos) {
                        n -= buf->wpos - buf->rpos;
+
+                       TAILQ_REMOVE(&msgbuf->bufs, buf, entry);
                        ibuf_dequeue(msgbuf, buf);
                } else {
                        buf->rpos += n;
@@ -204,33 +193,31 @@ msgbuf_drain(struct msgbuf *msgbuf, size_t n)
        }
 }
 
-void
-msgbuf_clear(struct msgbuf *msgbuf)
+void msgbuf_clear(struct msgbuf *msgbuf)
 {
-       struct ibuf     *buf;
+       struct ibuf *buf;
 
-       while ((buf = TAILQ_FIRST(&msgbuf->bufs)) != NULL)
+       while ((buf = TAILQ_POP_FIRST(&msgbuf->bufs, entry)) != NULL)
                ibuf_dequeue(msgbuf, buf);
 }
 
-int
-msgbuf_write(struct msgbuf *msgbuf)
+int msgbuf_write(struct msgbuf *msgbuf)
 {
-       struct iovec     iov[IOV_MAX];
-       struct ibuf     *buf;
-       unsigned int     i = 0;
-       ssize_t          n;
-       struct msghdr    msg;
-       struct cmsghdr  *cmsg;
+       struct iovec iov[IOV_MAX];
+       struct ibuf *buf;
+       unsigned int i = 0;
+       ssize_t n;
+       struct msghdr msg;
+       struct cmsghdr *cmsg;
        union {
-               struct cmsghdr  hdr;
-               char            buf[CMSG_SPACE(sizeof(int))];
+               struct cmsghdr hdr;
+               char buf[CMSG_SPACE(sizeof(int))];
        } cmsgbuf;
 
        memset(&iov, 0, sizeof(iov));
        memset(&msg, 0, sizeof(msg));
        memset(&cmsgbuf, 0, sizeof(cmsgbuf));
-       TAILQ_FOREACH(buf, &msgbuf->bufs, entry) {
+       TAILQ_FOREACH (buf, &msgbuf->bufs, entry) {
                if (i >= IOV_MAX)
                        break;
                iov[i].iov_base = buf->buf + buf->rpos;
@@ -259,12 +246,12 @@ again:
                        goto again;
                if (errno == ENOBUFS)
                        errno = EAGAIN;
-               return (-1);
+               return -1;
        }
 
-       if (n == 0) {                   /* connection closed */
+       if (n == 0) { /* connection closed */
                errno = 0;
-               return (0);
+               return 0;
        }
 
        /*
@@ -278,21 +265,18 @@ again:
 
        msgbuf_drain(msgbuf, n);
 
-       return (1);
+       return 1;
 }
 
-void
-ibuf_enqueue(struct msgbuf *msgbuf, struct ibuf *buf)
+static void ibuf_enqueue(struct msgbuf *msgbuf, struct ibuf *buf)
 {
        TAILQ_INSERT_TAIL(&msgbuf->bufs, buf, entry);
        msgbuf->queued++;
 }
 
-void
-ibuf_dequeue(struct msgbuf *msgbuf, struct ibuf *buf)
+static void ibuf_dequeue(struct msgbuf *msgbuf, struct ibuf *buf)
 {
-       TAILQ_REMOVE(&msgbuf->bufs, buf, entry);
-
+       /* TAILQ_REMOVE done by caller */
        if (buf->fd != -1)
                close(buf->fd);