continue;
}
- if (!object_path_is_valid(*k) && object_path_startswith(*k, prefix)) {
+ if (!object_path_is_valid(*k)){
free(*k);
r = -EINVAL;
continue;
}
+ if (!object_path_startswith(*k, prefix)) {
+ free(*k);
+ continue;
+ }
+
r = set_consume(s, *k);
}
LIST_FOREACH(siblings, i, n->child) {
char *t;
+ if (!object_path_startswith(i->path, prefix))
+ continue;
+
t = strdup(i->path);
if (!t)
return -ENOMEM;
sd_bus_error *error,
void *userdata) {
- int r;
const void *p;
assert(bus);
/* Automatic handling if no callback is defined. */
+ if (streq(v->x.property.signature, "as"))
+ return sd_bus_message_append_strv(m, *(char***) userdata);
+
assert(signature_is_single(v->x.property.signature, false));
assert(bus_type_is_basic(v->x.property.signature[0]));
break;
}
- r = sd_bus_message_append_basic(m, v->x.property.signature[0], p);
- if (r < 0)
- return r;
-
- return 1;
+ return sd_bus_message_append_basic(m, v->x.property.signature[0], p);
}
static int invoke_property_set(
_cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
struct node_vtable *c;
- bool found_interface = false;
+ bool found_interface;
int r;
assert(bus);
if (r < 0)
return r;
+ found_interface = !iface ||
+ streq(iface, "org.freedesktop.DBus.Properties") ||
+ streq(iface, "org.freedesktop.DBus.Peer") ||
+ streq(iface, "org.freedesktop.DBus.Introspectable");
+
LIST_FOREACH(vtables, c, first) {
_cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
void *u;
if (!member_name_is_valid(v->x.property.member) ||
!signature_is_single(v->x.property.signature, false) ||
- !(v->x.property.get || bus_type_is_basic(v->x.property.signature[0])) ||
+ !(v->x.property.get || bus_type_is_basic(v->x.property.signature[0]) || streq(v->x.property.signature, "as")) ||
v->flags & SD_BUS_VTABLE_METHOD_NO_REPLY ||
(v->flags & SD_BUS_VTABLE_PROPERTY_INVALIDATE_ONLY && !(v->flags & SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE))) {
r = -EINVAL;
case _SD_BUS_VTABLE_SIGNAL:
if (!member_name_is_valid(v->x.signal.member) ||
- !signature_is_single(strempty(v->x.signal.signature), false)) {
+ !signature_is_valid(strempty(v->x.signal.signature), false)) {
r = -EINVAL;
goto fail;
}