chiark / gitweb /
bus: add APIs for adding iovecs to messages as string or arrays
authorLennart Poettering <lennart@poettering.net>
Mon, 11 Nov 2013 15:26:12 +0000 (16:26 +0100)
committerLennart Poettering <lennart@poettering.net>
Mon, 11 Nov 2013 15:26:12 +0000 (16:26 +0100)
src/libsystemd-bus/bus-message.c
src/libsystemd-bus/libsystemd-bus.sym
src/systemd/sd-bus.h

index 1a50226b01292debae278ce0df43598625f3ad2e..b26d446578951cd5b75dd3cc72e63294b8efb84f 100644 (file)
@@ -1498,7 +1498,11 @@ _public_ int sd_bus_message_append_basic(sd_bus_message *m, char type, const voi
         return message_append_basic(m, type, p, NULL);
 }
 
         return message_append_basic(m, type, p, NULL);
 }
 
-_public_ int sd_bus_message_append_string_space(sd_bus_message *m, size_t size, char **s) {
+_public_ int sd_bus_message_append_string_space(
+                sd_bus_message *m,
+                size_t size,
+                char **s) {
+
         struct bus_container *c;
         void *a;
 
         struct bus_container *c;
         void *a;
 
@@ -1543,6 +1547,40 @@ _public_ int sd_bus_message_append_string_space(sd_bus_message *m, size_t size,
         return 0;
 }
 
         return 0;
 }
 
+_public_ int sd_bus_message_append_string_iovec(
+                sd_bus_message *m,
+                const struct iovec *iov,
+                unsigned n) {
+
+        size_t size;
+        unsigned i;
+        char *p;
+        int r;
+
+        assert_return(m, -EINVAL);
+        assert_return(!m->sealed, -EPERM);
+        assert_return(iov || n == 0, -EINVAL);
+        assert_return(!m->poisoned, -ESTALE);
+
+        size = IOVEC_TOTAL_SIZE(iov, n);
+
+        r = sd_bus_message_append_string_space(m, size, &p);
+        if (r < 0)
+                return r;
+
+        for (i = 0; i < n; i++) {
+
+                if (iov[i].iov_base)
+                        memcpy(p, iov[i].iov_base, iov[i].iov_len);
+                else
+                        memset(p, ' ', iov[i].iov_len);
+
+                p += iov[i].iov_len;
+        }
+
+        return 0;
+}
+
 static int bus_message_open_array(
                 sd_bus_message *m,
                 struct bus_container *c,
 static int bus_message_open_array(
                 sd_bus_message *m,
                 struct bus_container *c,
@@ -2159,6 +2197,42 @@ _public_ int sd_bus_message_append_array(sd_bus_message *m,
         return 0;
 }
 
         return 0;
 }
 
+_public_ int sd_bus_message_append_array_iovec(
+                sd_bus_message *m,
+                char type,
+                const struct iovec *iov,
+                unsigned n) {
+
+        size_t size;
+        unsigned i;
+        void *p;
+        int r;
+
+        assert_return(m, -EINVAL);
+        assert_return(!m->sealed, -EPERM);
+        assert_return(bus_type_is_trivial(type), -EINVAL);
+        assert_return(iov || n == 0, -EINVAL);
+        assert_return(!m->poisoned, -ESTALE);
+
+        size = IOVEC_TOTAL_SIZE(iov, n);
+
+        r = sd_bus_message_append_array_space(m, type, size, &p);
+        if (r < 0)
+                return r;
+
+        for (i = 0; i < n; i++) {
+
+                if (iov[i].iov_base)
+                        memcpy(p, iov[i].iov_base, iov[i].iov_len);
+                else
+                        memset(p, 0, iov[i].iov_len);
+
+                p = (uint8_t*) p + iov[i].iov_len;
+        }
+
+        return 0;
+}
+
 _public_ int sd_bus_message_append_array_memfd(sd_bus_message *m,
                                                char type,
                                                sd_memfd *memfd) {
 _public_ int sd_bus_message_append_array_memfd(sd_bus_message *m,
                                                char type,
                                                sd_memfd *memfd) {
index 4924cf16528a315fd49b3985aebf693fc704d4b2..2c4f07d7533b232945fc61b69819d4a6b13d76d2 100644 (file)
@@ -119,8 +119,10 @@ global:
         sd_bus_message_append_basic;
         sd_bus_message_append_array;
         sd_bus_message_append_array_space;
         sd_bus_message_append_basic;
         sd_bus_message_append_array;
         sd_bus_message_append_array_space;
+        sd_bus_message_append_array_iovec;
         sd_bus_message_append_array_memfd;
         sd_bus_message_append_string_space;
         sd_bus_message_append_array_memfd;
         sd_bus_message_append_string_space;
+        sd_bus_message_append_string_iovec;
         sd_bus_message_append_string_memfd;
         sd_bus_message_append_strv;
         sd_bus_message_open_container;
         sd_bus_message_append_string_memfd;
         sd_bus_message_append_strv;
         sd_bus_message_open_container;
index f843c778cb0d02b401d0c56087dd186da213e375..6202acb659ff8392762eed748876a8dafd258f91 100644 (file)
@@ -24,6 +24,7 @@
 
 #include <inttypes.h>
 #include <sys/types.h>
 
 #include <inttypes.h>
 #include <sys/types.h>
+#include <sys/uio.h>
 
 #include "sd-id128.h"
 #include "sd-event.h"
 
 #include "sd-id128.h"
 #include "sd-event.h"
@@ -186,8 +187,10 @@ int sd_bus_message_append(sd_bus_message *m, const char *types, ...);
 int sd_bus_message_append_basic(sd_bus_message *m, char type, const void *p);
 int sd_bus_message_append_array(sd_bus_message *m, char type, const void *ptr, size_t size);
 int sd_bus_message_append_array_space(sd_bus_message *m, char type, size_t size, void **ptr);
 int sd_bus_message_append_basic(sd_bus_message *m, char type, const void *p);
 int sd_bus_message_append_array(sd_bus_message *m, char type, const void *ptr, size_t size);
 int sd_bus_message_append_array_space(sd_bus_message *m, char type, size_t size, void **ptr);
+int sd_bus_message_append_array_iovec(sd_bus_message *m, char type, const struct iovec *iov, unsigned n);
 int sd_bus_message_append_array_memfd(sd_bus_message *m, char type, sd_memfd *memfd);
 int sd_bus_message_append_string_space(sd_bus_message *m, size_t size, char **s);
 int sd_bus_message_append_array_memfd(sd_bus_message *m, char type, sd_memfd *memfd);
 int sd_bus_message_append_string_space(sd_bus_message *m, size_t size, char **s);
+int sd_bus_message_append_string_iovec(sd_bus_message *m, const struct iovec *iov, unsigned n);
 int sd_bus_message_append_string_memfd(sd_bus_message *m, sd_memfd* memfd);
 int sd_bus_message_append_strv(sd_bus_message *m, char **l);
 int sd_bus_message_open_container(sd_bus_message *m, char type, const char *contents);
 int sd_bus_message_append_string_memfd(sd_bus_message *m, sd_memfd* memfd);
 int sd_bus_message_append_strv(sd_bus_message *m, char **l);
 int sd_bus_message_open_container(sd_bus_message *m, char type, const char *contents);