_public_ int sd_bus_get_property( sd_bus *bus, const char *destination, const char *path, const char *interface, const char *member, sd_bus_error *error, sd_bus_message **reply, const char *type) { sd_bus_message *rep = NULL; int r; assert_return(bus, -EINVAL); assert_return(isempty(interface) || interface_name_is_valid(interface), -EINVAL); assert_return(member_name_is_valid(member), -EINVAL); assert_return(reply, -EINVAL); assert_return(signature_is_single(type, false), -EINVAL); assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN); assert_return(!bus_pid_changed(bus), -ECHILD); r = sd_bus_call_method(bus, destination, path, "org.freedesktop.DBus.Properties", "Get", error, &rep, "ss", strempty(interface), member); if (r < 0) return r; r = sd_bus_message_enter_container(rep, 'v', type); if (r < 0) { sd_bus_message_unref(rep); return r; } *reply = rep; return 0; }
bool signature_is_pair(const char *s) { assert(s); if (!bus_type_is_basic(*s)) return false; return signature_is_single(s + 1, false); }
_public_ int sd_bus_set_property( sd_bus *bus, const char *destination, const char *path, const char *interface, const char *member, sd_bus_error *error, const char *type, ...) { _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL; va_list ap; int r; bus_assert_return(bus, -EINVAL, error); bus_assert_return(isempty(interface) || interface_name_is_valid(interface), -EINVAL, error); bus_assert_return(member_name_is_valid(member), -EINVAL, error); bus_assert_return(signature_is_single(type, false), -EINVAL, error); bus_assert_return(!bus_pid_changed(bus), -ECHILD, error); if (!BUS_IS_OPEN(bus->state)) { r = -ENOTCONN; goto fail; } r = sd_bus_message_new_method_call(bus, &m, destination, path, "org.freedesktop.DBus.Properties", "Set"); if (r < 0) goto fail; r = sd_bus_message_append(m, "ss", strempty(interface), member); if (r < 0) goto fail; r = sd_bus_message_open_container(m, 'v', type); if (r < 0) goto fail; va_start(ap, type); r = sd_bus_message_appendv(m, type, ap); va_end(ap); if (r < 0) goto fail; r = sd_bus_message_close_container(m); if (r < 0) goto fail; return sd_bus_call(bus, m, 0, error, NULL); fail: return sd_bus_error_set_errno(error, r); }
int main(int argc, char *argv[]) { assert_se(signature_is_single("y")); assert_se(signature_is_single("u")); assert_se(signature_is_single("v")); assert_se(signature_is_single("as")); assert_se(signature_is_single("(ss)")); assert_se(signature_is_single("()")); assert_se(signature_is_single("(()()()()())")); assert_se(signature_is_single("(((())))")); assert_se(signature_is_single("((((s))))")); assert_se(signature_is_single("{ss}")); assert_se(signature_is_single("a{ss}")); assert_se(!signature_is_single("uu")); assert_se(!signature_is_single("")); assert_se(!signature_is_single("(")); assert_se(!signature_is_single(")")); assert_se(!signature_is_single("())")); assert_se(!signature_is_single("((())")); assert_se(!signature_is_single("{)")); assert_se(!signature_is_single("{}")); assert_se(!signature_is_single("{sss}")); assert_se(!signature_is_single("{s}")); assert_se(!signature_is_single("{ass}")); assert_se(!signature_is_single("a}")); assert_se(signature_is_pair("yy")); assert_se(signature_is_pair("ss")); assert_se(signature_is_pair("sas")); assert_se(signature_is_pair("sv")); assert_se(signature_is_pair("sa(vs)")); assert_se(!signature_is_pair("")); assert_se(!signature_is_pair("va")); assert_se(!signature_is_pair("sss")); assert_se(!signature_is_pair("{s}ss")); assert_se(signature_is_valid("ssa{ss}sssub", true)); assert_se(signature_is_valid("ssa{ss}sssub", false)); assert_se(signature_is_valid("{ss}", true)); assert_se(!signature_is_valid("{ss}", false)); assert_se(signature_is_valid("", true)); assert_se(signature_is_valid("", false)); assert_se(signature_is_valid("sssusa(uuubbba(uu)uuuu)a{u(uuuvas)}", false)); assert_se(!signature_is_valid("a", false)); assert_se(signature_is_valid("as", false)); assert_se(signature_is_valid("aas", false)); assert_se(signature_is_valid("aaas", false)); assert_se(signature_is_valid("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaad", false)); assert_se(signature_is_valid("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaas", false)); assert_se(!signature_is_valid("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaau", false)); assert_se(signature_is_valid("(((((((((((((((((((((((((((((((())))))))))))))))))))))))))))))))", false)); assert_se(!signature_is_valid("((((((((((((((((((((((((((((((((()))))))))))))))))))))))))))))))))", false)); assert_se(namespace_complex_pattern("", "")); assert_se(namespace_complex_pattern("foobar", "foobar")); assert_se(namespace_complex_pattern("foobar.waldo", "foobar.waldo")); assert_se(namespace_complex_pattern("foobar.", "foobar.waldo")); assert_se(namespace_complex_pattern("foobar.waldo", "foobar.")); assert_se(!namespace_complex_pattern("foobar.waldo", "foobar")); assert_se(!namespace_complex_pattern("foobar", "foobar.waldo")); assert_se(!namespace_complex_pattern("", "foo")); assert_se(!namespace_complex_pattern("foo", "")); assert_se(!namespace_complex_pattern("foo.", "")); assert_se(path_complex_pattern("", "")); assert_se(path_complex_pattern("", "/")); assert_se(path_complex_pattern("/", "")); assert_se(path_complex_pattern("/", "/")); assert_se(path_complex_pattern("/foobar/", "/")); assert_se(path_complex_pattern("/foobar/", "/foobar")); assert_se(path_complex_pattern("/foobar", "/foobar")); assert_se(path_complex_pattern("/foobar", "/foobar/")); assert_se(!path_complex_pattern("/foobar", "/foobar/waldo")); assert_se(path_complex_pattern("/foobar/", "/foobar/waldo")); assert_se(namespace_simple_pattern("", "")); assert_se(namespace_simple_pattern("foobar", "foobar")); assert_se(namespace_simple_pattern("foobar.waldo", "foobar.waldo")); assert_se(namespace_simple_pattern("foobar", "foobar.waldo")); assert_se(!namespace_simple_pattern("foobar.waldo", "foobar")); assert_se(!namespace_simple_pattern("", "foo")); assert_se(!namespace_simple_pattern("foo", "")); return 0; }