bus: support entering containers without specifying the type

On request om Tom Gundersen...
This commit is contained in:
Lennart Poettering
2013-11-05 03:07:39 +01:00
parent 9f6eb1cd58
commit 275b39fe4b
2 changed files with 42 additions and 7 deletions
+22 -6
View File
@@ -2982,12 +2982,28 @@ int sd_bus_message_enter_container(sd_bus_message *m, char type, const char *con
size_t before;
int r;
if (!m)
return -EINVAL;
if (!m->sealed)
return -EPERM;
if (!contents)
return -EINVAL;
assert_return(m, -EINVAL);
assert_return(m->sealed, -EPERM);
assert_return(type != 0 || !contents, -EINVAL);
if (type == 0 || !contents) {
const char *cc;
char tt;
/* Allow entering into anonymous containers */
r = sd_bus_message_peek_type(m, &tt, &cc);
if (r <= 0)
return r;
if (type != 0 && type != tt)
return -ENXIO;
if (contents && !streq(contents, cc))
return -ENXIO;
type = tt;
contents = cc;
}
/*
* We enforce a global limit on container depth, that is much
+20 -1
View File
@@ -252,9 +252,28 @@ int main(int argc, char *argv[]) {
assert_se(sd_bus_message_verify_type(m, 'b', NULL) > 0);
r = sd_bus_message_read(m, "ba(ss)", &boolean, 3, &x, &y, &a, &b, &c, &d);
r = sd_bus_message_read(m, "b", &boolean);
assert_se(r > 0);
assert_se(boolean);
r = sd_bus_message_enter_container(m, 0, NULL);
assert_se(r > 0);
r = sd_bus_message_read(m, "(ss)", &x, &y);
assert_se(r > 0);
r = sd_bus_message_read(m, "(ss)", &a, &b);
assert_se(r > 0);
r = sd_bus_message_read(m, "(ss)", &c, &d);
assert_se(r > 0);
r = sd_bus_message_read(m, "(ss)", &x, &y);
assert_se(r == 0);
r = sd_bus_message_exit_container(m);
assert_se(r >= 0);
assert_se(streq(x, "aaa"));
assert_se(streq(y, "1"));
assert_se(streq(a, "bbb"));