]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/stream.c
zebra, lib: fix the ZEBRA_INTERFACE_VRF_UPDATE zapi message
[mirror_frr.git] / lib / stream.c
index cf9af4d3bb98fd768e8b3a9fe64acb20a33df60b..6c187bd359a842b558b190c50ed031db3a9c7bfa 100644 (file)
@@ -28,9 +28,9 @@
 #include "network.h"
 #include "prefix.h"
 #include "log.h"
+#include "lib_errors.h"
 
 DEFINE_MTYPE_STATIC(LIB, STREAM, "Stream")
-DEFINE_MTYPE_STATIC(LIB, STREAM_DATA, "Stream data")
 DEFINE_MTYPE_STATIC(LIB, STREAM_FIFO, "Stream FIFO")
 
 /* Tests whether a position is valid */
@@ -54,7 +54,8 @@ DEFINE_MTYPE_STATIC(LIB, STREAM_FIFO, "Stream FIFO")
  * using stream_put..._at() functions.
  */
 #define STREAM_WARN_OFFSETS(S)                                                 \
-       zlog_warn("&(struct stream): %p, size: %lu, getp: %lu, endp: %lu\n",   \
+       flog_warn(EC_LIB_STREAM,                                               \
+                 "&(struct stream): %p, size: %lu, getp: %lu, endp: %lu\n",   \
                  (void *)(S), (unsigned long)(S)->size,                       \
                  (unsigned long)(S)->getp, (unsigned long)(S)->endp)
 
@@ -68,16 +69,16 @@ DEFINE_MTYPE_STATIC(LIB, STREAM_FIFO, "Stream FIFO")
 
 #define STREAM_BOUND_WARN(S, WHAT)                                             \
        do {                                                                   \
-               zlog_warn("%s: Attempt to %s out of bounds", __func__,         \
-                         (WHAT));                                             \
+               flog_warn(EC_LIB_STREAM, "%s: Attempt to %s out of bounds",    \
+                         __func__, (WHAT));                                   \
                STREAM_WARN_OFFSETS(S);                                        \
                assert(0);                                                     \
        } while (0)
 
 #define STREAM_BOUND_WARN2(S, WHAT)                                            \
        do {                                                                   \
-               zlog_warn("%s: Attempt to %s out of bounds", __func__,         \
-                         (WHAT));                                             \
+               flog_warn(EC_LIB_STREAM, "%s: Attempt to %s out of bounds",    \
+                         __func__, (WHAT));                                   \
                STREAM_WARN_OFFSETS(S);                                        \
        } while (0)
 
@@ -85,7 +86,8 @@ DEFINE_MTYPE_STATIC(LIB, STREAM_FIFO, "Stream FIFO")
 #define CHECK_SIZE(S, Z)                                                       \
        do {                                                                   \
                if (((S)->endp + (Z)) > (S)->size) {                           \
-                       zlog_warn(                                             \
+                       flog_warn(                                             \
+                               EC_LIB_STREAM,                                 \
                                "CHECK_SIZE: truncating requested size %lu\n", \
                                (unsigned long)(Z));                           \
                        STREAM_WARN_OFFSETS(S);                                \
@@ -100,9 +102,7 @@ struct stream *stream_new(size_t size)
 
        assert(size > 0);
 
-       s = XMALLOC(MTYPE_STREAM, sizeof(struct stream));
-
-       s->data = XMALLOC(MTYPE_STREAM_DATA, size);
+       s = XMALLOC(MTYPE_STREAM, sizeof(struct stream) + size);
 
        s->getp = s->endp = 0;
        s->next = NULL;
@@ -116,7 +116,6 @@ void stream_free(struct stream *s)
        if (!s)
                return;
 
-       XFREE(MTYPE_STREAM_DATA, s->data);
        XFREE(MTYPE_STREAM, s);
 }
 
@@ -166,27 +165,33 @@ struct stream *stream_dupcat(struct stream *s1, struct stream *s2,
        return new;
 }
 
-size_t stream_resize(struct stream *s, size_t newsize)
+size_t stream_resize_inplace(struct stream **sptr, size_t newsize)
 {
-       uint8_t *newdata;
-       STREAM_VERIFY_SANE(s);
+       struct stream *orig = *sptr;
 
-       newdata = XREALLOC(MTYPE_STREAM_DATA, s->data, newsize);
+       STREAM_VERIFY_SANE(orig);
 
-       if (newdata == NULL)
-               return s->size;
+       orig = XREALLOC(MTYPE_STREAM, orig, sizeof(struct stream) + newsize);
 
-       s->data = newdata;
-       s->size = newsize;
+       orig->size = newsize;
 
-       if (s->endp > s->size)
-               s->endp = s->size;
-       if (s->getp > s->endp)
-               s->getp = s->endp;
+       if (orig->endp > orig->size)
+               orig->endp = orig->size;
+       if (orig->getp > orig->endp)
+               orig->getp = orig->endp;
 
-       STREAM_VERIFY_SANE(s);
+       STREAM_VERIFY_SANE(orig);
 
-       return s->size;
+       *sptr = orig;
+       return orig->size;
+}
+
+size_t __attribute__((deprecated))stream_resize_orig(struct stream *s,
+                                                    size_t newsize)
+{
+       assert("stream_resize: Switch code to use stream_resize_inplace" == NULL);
+
+       return stream_resize_inplace(&s, newsize);
 }
 
 size_t stream_get_getp(struct stream *s)
@@ -267,7 +272,7 @@ void stream_forward_endp(struct stream *s, size_t size)
 }
 
 /* Copy from stream to destination. */
-inline bool stream_get2(void *dst, struct stream *s, size_t size)
+bool stream_get2(void *dst, struct stream *s, size_t size)
 {
        STREAM_VERIFY_SANE(s);
 
@@ -296,7 +301,7 @@ void stream_get(void *dst, struct stream *s, size_t size)
 }
 
 /* Get next character from the stream. */
-inline bool stream_getc2(struct stream *s, uint8_t *byte)
+bool stream_getc2(struct stream *s, uint8_t *byte)
 {
        STREAM_VERIFY_SANE(s);
 
@@ -341,7 +346,7 @@ uint8_t stream_getc_from(struct stream *s, size_t from)
        return c;
 }
 
-inline bool stream_getw2(struct stream *s, uint16_t *word)
+bool stream_getw2(struct stream *s, uint16_t *word)
 {
        STREAM_VERIFY_SANE(s);
 
@@ -462,7 +467,7 @@ void stream_get_from(void *dst, struct stream *s, size_t from, size_t size)
        memcpy(dst, s->data + from, size);
 }
 
-inline bool stream_getl2(struct stream *s, uint32_t *l)
+bool stream_getl2(struct stream *s, uint32_t *l)
 {
        STREAM_VERIFY_SANE(s);
 
@@ -963,8 +968,8 @@ ssize_t stream_read_try(struct stream *s, int fd, size_t size)
        /* Error: was it transient (return -2) or fatal (return -1)? */
        if (ERRNO_IO_RETRY(errno))
                return -2;
-       zlog_warn("%s: read failed on fd %d: %s", __func__, fd,
-                 safe_strerror(errno));
+       flog_err(EC_LIB_SOCKET, "%s: read failed on fd %d: %s", __func__, fd,
+                safe_strerror(errno));
        return -1;
 }
 
@@ -994,8 +999,8 @@ ssize_t stream_recvfrom(struct stream *s, int fd, size_t size, int flags,
        /* Error: was it transient (return -2) or fatal (return -1)? */
        if (ERRNO_IO_RETRY(errno))
                return -2;
-       zlog_warn("%s: read failed on fd %d: %s", __func__, fd,
-                 safe_strerror(errno));
+       flog_err(EC_LIB_SOCKET, "%s: read failed on fd %d: %s", __func__, fd,
+                safe_strerror(errno));
        return -1;
 }