chiark / gitweb /
bus: support implicit serialization of strv string arrays within vtables
[elogind.git] / src / libsystemd-bus / bus-objects.c
index aa0be37a9de8061d918e9bbb258c651cd0d252f2..92781e9adcc1ef2192c40c4657f9759b03632dd8 100644 (file)
@@ -312,7 +312,6 @@ static int invoke_property_get(
                 sd_bus_error *error,
                 void *userdata) {
 
-        int r;
         const void *p;
 
         assert(bus);
@@ -327,6 +326,9 @@ static int invoke_property_get(
 
         /* 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]));
 
@@ -347,11 +349,7 @@ static int invoke_property_get(
                 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(
@@ -600,7 +598,7 @@ static int property_get_all_callbacks_run(
         if (r < 0)
                 return r;
 
-        found_interface =
+        found_interface = !iface ||
                 streq(iface, "org.freedesktop.DBus.Properties") ||
                 streq(iface, "org.freedesktop.DBus.Peer") ||
                 streq(iface, "org.freedesktop.DBus.Introspectable");
@@ -1587,7 +1585,7 @@ static int add_object_vtable_internal(
 
                         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;
@@ -1619,7 +1617,7 @@ static int add_object_vtable_internal(
                 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;
                         }