Add async bindings to kdbus
authorMaciej Slodczyk <m.slodczyk2@partner.samsung.com>
Fri, 21 Feb 2020 10:07:34 +0000 (11:07 +0100)
committerŁukasz Stelmach <l.stelmach@samsung.com>
Thu, 25 Jan 2024 12:22:10 +0000 (13:22 +0100)
Signed-off-by: Maciej Slodczyk <m.slodczyk2@partner.samsung.com>
src/libsystemd/sd-bus/bus-control-kernel.c
src/libsystemd/sd-bus/bus-control-kernel.h
src/libsystemd/sd-bus/bus-control.c
src/libsystemd/sd-bus/bus-control.h
src/libsystemd/sd-bus/sd-bus.c

index bbd5d15..b09f5b7 100644 (file)
@@ -72,6 +72,80 @@ int bus_request_name_kernel(sd_bus *bus, const char *name, uint64_t flags) {
         return 1;
 }
 
+struct kernel_async_call_data {
+       sd_bus *bus;
+       sd_bus_message_handler_t callback;
+       void *userdata;
+       int retval;
+       sd_event_source *event;
+};
+
+static int bus_name_kernel_async_callback(
+               sd_event_source *s,
+               uint64_t usec,
+               void *userdata) {
+
+       struct kernel_async_call_data *k;
+       sd_bus_message *m;
+       sd_bus_error e;
+       int ret;
+
+       assert(userdata);
+
+       k = (struct kernel_async_call_data *)userdata;
+
+       if (k->retval < 0) {
+               ret = sd_bus_message_new(k->bus, &m, SD_BUS_MESSAGE_METHOD_ERROR);
+               if (ret < 0)
+                       return ret;
+       } else {
+               ret = sd_bus_message_new(k->bus, &m, SD_BUS_MESSAGE_METHOD_RETURN);
+               if (ret < 0)
+                       return ret;
+
+               sd_bus_message_append(m, "i", ret);
+       }
+
+       sd_bus_error_set_errno(&e, k->retval);
+
+       ret = 0;
+       if (k->callback)
+               ret = k->callback(m, k->userdata, &e);
+
+       sd_bus_error_free(&e);
+       sd_event_source_unref(k->event);
+       sd_bus_message_unref(m);
+       free(k);
+
+       return ret;
+}
+
+int bus_request_name_kernel_async(sd_bus *bus,
+               sd_bus_slot **ret_slot,
+               const char *name,
+               uint64_t flags,
+               sd_bus_message_handler_t callback,
+               void *userdata) {
+       struct kernel_async_call_data *k;
+       int ret;
+
+       if (!bus->event)
+               return 0;
+
+       ret     = bus_request_name_kernel(bus, name, flags);
+
+       k = (struct kernel_async_call_data *)calloc(1, sizeof *k);
+       k->bus = bus;
+       k->callback = callback;
+       k->userdata = userdata;
+       k->retval = ret;
+
+       /*TODO*/
+       *ret_slot = NULL;
+
+       return sd_event_add_time(bus->event, &k->event, CLOCK_MONOTONIC, 0, 1, bus_name_kernel_async_callback, (void *)k);
+}
+
 int bus_release_name_kernel(sd_bus *bus, const char *name) {
         struct kdbus_cmd *n;
         size_t size, l;
@@ -99,6 +173,33 @@ int bus_release_name_kernel(sd_bus *bus, const char *name) {
         return 0;
 }
 
+int bus_release_name_kernel_async(
+                               sd_bus *bus,
+                sd_bus_slot **ret_slot,
+                const char *name,
+                sd_bus_message_handler_t callback,
+                void *userdata) {
+       struct kernel_async_call_data *k;
+       int ret;
+
+       if (!bus->event)
+               return 0;
+
+       ret     = bus_release_name_kernel(bus, name);
+
+       k = (struct kernel_async_call_data *)calloc(1, sizeof *k);
+       k->bus = bus;
+       k->callback = callback;
+       k->userdata = userdata;
+       k->retval = ret;
+
+       /*TODO*/
+       *ret_slot = NULL;
+
+       return sd_event_add_time(bus->event, &k->event, CLOCK_MONOTONIC, 0, 1, bus_name_kernel_async_callback, (void *)k);
+}
+
+
 static int kernel_get_list(sd_bus *bus, uint64_t flags, char ***x) {
         struct kdbus_cmd_list cmd = {
                 .size = sizeof(cmd),
@@ -1023,6 +1124,70 @@ int bus_add_match_internal_kernel(
         return 0;
 }
 
+static int bus_match_kernel_async_callback(
+               sd_event_source *s,
+               uint64_t usec,
+               void *userdata) {
+
+       assert(userdata);
+
+       struct kernel_async_call_data *k;
+       sd_bus_message *m;
+       sd_bus_error e;
+       int ret;
+
+       k = (struct kernel_async_call_data *)userdata;
+
+       if (k->retval < 0)
+               ret = sd_bus_message_new(k->bus, &m, SD_BUS_MESSAGE_METHOD_ERROR);
+       else
+               ret = sd_bus_message_new(k->bus, &m, SD_BUS_MESSAGE_METHOD_RETURN);
+
+       if (ret < 0)
+               return ret;
+
+       sd_bus_error_set_errno(&e, k->retval);
+
+       ret = 0;
+       if (k->callback)
+               ret = k->callback(m, k->userdata, &e);
+
+       sd_bus_error_free(&e);
+       sd_event_source_unref(k->event);
+       sd_bus_message_unref(m);
+       free(k);
+
+       return ret;
+}
+
+int bus_add_match_internal_kernel_async(
+         sd_bus *bus,
+         sd_bus_slot **ret_slot,
+         const char *match,
+         struct bus_match_component *components,
+         unsigned n_components,
+         uint64_t cookie,
+         sd_bus_message_handler_t callback,
+         void *userdata)
+{
+       int ret;
+       struct kernel_async_call_data *k;
+
+    ret = bus_add_match_internal_kernel(bus, components, n_components, cookie);
+
+       k = (struct kernel_async_call_data *)calloc(1, sizeof *k);
+       k->bus = bus;
+       k->callback = callback;
+       k->userdata = userdata;
+       k->retval = ret;
+
+       /*TODO*/
+       *ret_slot = NULL;
+
+       return sd_event_add_time(bus->event, &k->event, CLOCK_MONOTONIC, 0, 1, bus_match_kernel_async_callback, (void *)k);
+
+}
+
 int bus_remove_match_internal_kernel(
                 sd_bus *bus,
                 uint64_t cookie) {
index 7f8e166..ff9db25 100644 (file)
 #include "bus-match.h"
 
 int bus_request_name_kernel(sd_bus *bus, const char *name, uint64_t flags);
+int bus_request_name_kernel_async(
+                sd_bus *bus,
+                sd_bus_slot **ret_slot,
+                const char *name,
+                uint64_t flags,
+                sd_bus_message_handler_t callback,
+                void *userdata);
 int bus_release_name_kernel(sd_bus *bus, const char *name);
+int bus_release_name_kernel_async(
+                sd_bus *bus,
+                sd_bus_slot **ret_slot,
+                const char *name,
+                sd_bus_message_handler_t callback,
+                void *userdata);
 int bus_list_names_kernel(sd_bus *bus, char ***acquired, char ***activatable);
 int bus_get_name_creds_kdbus(
                 sd_bus *bus,
@@ -38,6 +51,15 @@ int bus_add_match_internal_kernel(
                 struct bus_match_component *components,
                 unsigned n_components,
                 uint64_t cookie);
+int bus_add_match_internal_kernel_async(
+                sd_bus *bus,
+                sd_bus_slot **ret_slot,
+                const char *match,
+                struct bus_match_component *components,
+                unsigned n_components,
+                uint64_t cookie,
+                sd_bus_message_handler_t callback,
+                void *userdata);
 int bus_remove_match_internal_kernel(
                 sd_bus *bus,
                 uint64_t cookie);
index 81b4fed..e4d184f 100644 (file)
@@ -223,6 +223,9 @@ _public_ int sd_bus_request_name_async(
         if (r < 0)
                 return r;
 
+        if (bus->is_kernel)
+                return bus_request_name_kernel_async(bus, ret_slot, name, flags, callback ?: default_request_name_handler, userdata);
+
         return sd_bus_call_method_async(
                         bus,
                         ret_slot,
@@ -373,6 +376,9 @@ _public_ int sd_bus_release_name_async(
         if (r < 0)
                 return r;
 
+        if (bus->is_kernel)
+                return bus_release_name_kernel_async(bus, ret_slot, name, callback ?: default_release_name_handler, userdata);
+
         return sd_bus_call_method_async(
                         bus,
                         ret_slot,
@@ -871,6 +877,9 @@ int bus_add_match_internal_async(
                 sd_bus *bus,
                 sd_bus_slot **ret_slot,
                 const char *match,
+                struct bus_match_component *components,
+                unsigned n_components,
+                uint64_t cookie,
                 sd_bus_message_handler_t callback,
                 void *userdata) {
 
@@ -881,6 +890,9 @@ int bus_add_match_internal_async(
         if (!bus->bus_client)
                 return -EINVAL;
 
+        if (bus->is_kernel)
+                return bus_add_match_internal_kernel_async(bus, ret_slot, match, components, n_components, cookie, callback, userdata);
+
         e = append_eavesdrop(bus, match);
 
         return sd_bus_call_method_async(
index f5659cd..e450bbd 100644 (file)
 #include "sd-bus.h"
 #include "bus-match.h"
 
-int bus_add_match_internal(sd_bus *bus, const char *match, struct bus_match_component *components, unsigned n_components, uint64_t cookie);
-int bus_add_match_internal_async(sd_bus *bus, sd_bus_slot **ret, const char *match, sd_bus_message_handler_t callback, void *userdata);
+int bus_add_match_internal(
+        sd_bus *bus,
+        const char *match,
+        struct bus_match_component *components,
+        unsigned n_components,
+        uint64_t cookie);
+int bus_add_match_internal_async(
+        sd_bus *bus,
+        sd_bus_slot **ret,
+        const char *match,
+        struct bus_match_component *components,
+        unsigned n_components,
+        uint64_t cookie,
+        sd_bus_message_handler_t callback,
+        void *userdata);
 int bus_remove_match_internal(sd_bus *bus, const char *match, uint64_t cookie);
index d5786f5..ef477f4 100644 (file)
@@ -3477,6 +3477,9 @@ static int bus_add_match_full(
                                 r = bus_add_match_internal_async(bus,
                                                                  &s->match_callback.install_slot,
                                                                  s->match_callback.match_string,
+                                                                 components,
+                                                                 n_components,
+                                                                 s->match_callback.cookie,
                                                                  add_match_callback,
                                                                  s);
                         else