[systemd-devel] [PATCH 2/3] bus: add sd_bus_message_end_of_container

Marc-Antoine Perennou Marc-Antoine at Perennou.com
Tue Nov 5 04:42:26 PST 2013


Useful to check whether there are still things to read or not,
in order to be able not to allocate when not needed, when reading
arrays or such.
Will soon be used in systemctl

Signed-off-by: Marc-Antoine Perennou <Marc-Antoine at Perennou.com>
---
 src/libsystemd-bus/bus-message.c | 22 +++++++++++++++-------
 src/systemd/sd-bus.h             |  1 +
 2 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/src/libsystemd-bus/bus-message.c b/src/libsystemd-bus/bus-message.c
index 1050151..d683d70 100644
--- a/src/libsystemd-bus/bus-message.c
+++ b/src/libsystemd-bus/bus-message.c
@@ -1906,6 +1906,14 @@ int sd_bus_message_open_container(
         return 0;
 }
 
+int sd_bus_message_end_of_container(sd_bus_message *m) {
+    struct bus_container *c;
+
+    c = message_get_container(m);
+
+    return !c->signature || c->signature[c->index] == 0;
+}
+
 int sd_bus_message_close_container(sd_bus_message *m) {
         struct bus_container *c;
 
@@ -2654,7 +2662,7 @@ int sd_bus_message_read_basic(sd_bus_message *m, char type, void *p) {
 
         c = message_get_container(m);
 
-        if (!c->signature || c->signature[c->index] == 0)
+        if (sd_bus_message_end_of_container(m))
                 return -ENXIO;
 
         if (message_end_of_array(m, m->rindex))
@@ -2817,7 +2825,7 @@ static int bus_message_enter_array(
         if (alignment < 0)
                 return alignment;
 
-        if (!c->signature || c->signature[c->index] == 0)
+        if (sd_bus_message_end_of_container(m))
                 return 0;
 
         if (c->signature[c->index] != SD_BUS_TYPE_ARRAY)
@@ -2870,7 +2878,7 @@ static int bus_message_enter_variant(
         if (*contents == SD_BUS_TYPE_DICT_ENTRY_BEGIN)
                 return -EINVAL;
 
-        if (!c->signature || c->signature[c->index] == 0)
+        if (sd_bus_message_end_of_container(m))
                 return 0;
 
         if (c->signature[c->index] != SD_BUS_TYPE_VARIANT)
@@ -2917,7 +2925,7 @@ static int bus_message_enter_struct(
         if (!signature_is_valid(contents, false))
                 return -EINVAL;
 
-        if (!c->signature || c->signature[c->index] == 0)
+        if (sd_bus_message_end_of_container(m))
                 return 0;
 
         l = strlen(contents);
@@ -2955,7 +2963,7 @@ static int bus_message_enter_dict_entry(
         if (c->enclosing != SD_BUS_TYPE_ARRAY)
                 return -ENXIO;
 
-        if (!c->signature || c->signature[c->index] == 0)
+        if (sd_bus_message_end_of_container(m))
                 return 0;
 
         l = strlen(contents);
@@ -3031,7 +3039,7 @@ int sd_bus_message_enter_container(sd_bus_message *m, char type, const char *con
 
         c = message_get_container(m);
 
-        if (!c->signature || c->signature[c->index] == 0)
+        if (sd_bus_message_end_of_container(m))
                 return -ENXIO;
 
         if (message_end_of_array(m, m->rindex))
@@ -3132,7 +3140,7 @@ int sd_bus_message_peek_type(sd_bus_message *m, char *type, const char **content
 
         c = message_get_container(m);
 
-        if (!c->signature || c->signature[c->index] == 0)
+        if (sd_bus_message_end_of_container(m))
                 goto eof;
 
         if (message_end_of_array(m, m->rindex))
diff --git a/src/systemd/sd-bus.h b/src/systemd/sd-bus.h
index 1a1cce9..34bd663 100644
--- a/src/systemd/sd-bus.h
+++ b/src/systemd/sd-bus.h
@@ -200,6 +200,7 @@ int sd_bus_message_read_array(sd_bus_message *m, char type, const void **ptr, si
 int sd_bus_message_read_strv(sd_bus_message *m, char ***ptr);
 int sd_bus_message_skip(sd_bus_message *m, const char *types);
 int sd_bus_message_enter_container(sd_bus_message *m, char type, const char *contents);
+int sd_bus_message_end_of_container(sd_bus_message *m);
 int sd_bus_message_exit_container(sd_bus_message *m);
 int sd_bus_message_peek_type(sd_bus_message *m, char *type, const char **contents);
 int sd_bus_message_verify_type(sd_bus_message *m, char type, const char *contents);
-- 
1.8.4.2



More information about the systemd-devel mailing list