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;
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),
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) {
#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,
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);
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,
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,
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) {
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(