chiark / gitweb /
bus: make it easy to serialize C99 bools and uids/gids/pids via vtable properties
[elogind.git] / src / libsystemd-bus / bus-util.c
index 857e0c16edb4be40f6a3383b34c98a8b0253256d..ad1cb1a6d0fe84e5ab6cbe56ca1454341b885f98 100644 (file)
@@ -656,7 +656,7 @@ int bus_map_all_properties(sd_bus *bus,
                                 break;
 
                         for (i = 0; map[i].type; i++) {
-                                const char **p;
+                                char **p;
 
                                 if (!streq(map[i].type, "s"))
                                         continue;
@@ -664,6 +664,7 @@ int bus_map_all_properties(sd_bus *bus,
                                         continue;
 
                                 p = map[i].ptr;
+                                free(*p);
                                 *p = strdup(s);
                                 if (!*p) {
                                         r = -ENOMEM;
@@ -788,3 +789,33 @@ int bus_open_transport(BusTransport transport, const char *host, bool user, sd_b
 
         return r;
 }
+
+int bus_property_get_bool(
+                sd_bus *bus,
+                const char *path,
+                const char *interface,
+                const char *property,
+                sd_bus_message *reply,
+                sd_bus_error *error,
+                void *userdata) {
+
+        int b = *(bool*) userdata;
+
+        return sd_bus_message_append_basic(reply, 'b', &b);
+}
+
+int bus_property_get_uid(
+                sd_bus *bus,
+                const char *path,
+                const char *interface,
+                const char *property,
+                sd_bus_message *reply,
+                sd_bus_error *error,
+                void *userdata) {
+
+        assert_cc(sizeof(uint32_t) == sizeof(uid_t));
+        assert_cc(sizeof(uint32_t) == sizeof(gid_t));
+        assert_cc(sizeof(uint32_t) == sizeof(pid_t));
+
+        return sd_bus_message_append_basic(reply, 'u', userdata);
+}