summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaweł Szewczyk <p.szewczyk@samsung.com>2019-07-29 13:46:23 +0200
committerHyotaek Shim <hyotaek.shim@samsung.com>2019-08-13 09:32:03 +0000
commitba3d6a4b4e2cdde5349b3a3a18e55589c1c1db20 (patch)
tree352af4362f7020c84509f3724179191223b621ac
parentb8e764834187c627f441c110fa4703d7bf6aedd0 (diff)
downloadactivationd-ba3d6a4b4e2cdde5349b3a3a18e55589c1c1db20.tar.gz
activationd-ba3d6a4b4e2cdde5349b3a3a18e55589c1c1db20.tar.bz2
activationd-ba3d6a4b4e2cdde5349b3a3a18e55589c1c1db20.zip
Change-Id: If5809e26cc1d508a8892c03057b7ad8a2f15bc93 Signed-off-by: Paweł Szewczyk <p.szewczyk@samsung.com>
-rw-r--r--include/systemd_dbus.h10
-rw-r--r--src/action/unit_start.c47
-rw-r--r--src/util/systemd_dbus.c54
3 files changed, 44 insertions, 67 deletions
diff --git a/include/systemd_dbus.h b/include/systemd_dbus.h
index 96741b8..c9101cb 100644
--- a/include/systemd_dbus.h
+++ b/include/systemd_dbus.h
@@ -20,6 +20,7 @@
#define EPC_SYSTEMD_DBUS_H
#include <systemd/sd-bus.h>
+#include <libsyscommon/dbus-system.h>
#define SYSTEMD_SERVICE "org.freedesktop.systemd1"
@@ -32,24 +33,23 @@
#define SYSTEMD_KERNEL_BUS "kernel:path=/sys/fs/kdbus/0-system/bus"
int epc_dbus_call(char *service, char *obj, char *interface, char *method,
- sd_bus_error *error, sd_bus_message **out_msg,
char *args, ...);
#define epc_dbus_call_simple(SRV, OBJ, INTF, METHOD, ARGS, ...) \
- epc_dbus_call(SRV, OBJ, INTF, METHOD, NULL, NULL, ARGS, ##__VA_ARGS__)
+ epc_dbus_call(SRV, OBJ, INTF, METHOD, ARGS, ##__VA_ARGS__)
#define epc_dbus_call_systemd_simple(OBJ, INTF, METHOD, ARGS, ...) \
epc_dbus_call_simple(SYSTEMD_SERVICE, OBJ, INTF, METHOD, \
ARGS, ##__VA_ARGS__)
-typedef sd_bus_message_handler_t epc_dbus_handler_t;
+typedef dbus_pending_cb epc_dbus_handler_t;
int epc_dbus_call_async(char *service, char *obj, char *interface, char *method,
- sd_bus_error *error, epc_dbus_handler_t cb,
+ epc_dbus_handler_t cb,
void *user_data, char *args, ...);
#define epc_dbus_call_simple_async(SRV, OBJ, INTF, METHOD, CB, DATA, ARGS, ...) \
- epc_dbus_call_async(SRV, OBJ, INTF, METHOD, NULL, CB, DATA, ARGS, ##__VA_ARGS__)
+ epc_dbus_call_async(SRV, OBJ, INTF, METHOD, CB, DATA, ARGS, ##__VA_ARGS__)
#define epc_dbus_call_systemd_simple_async(OBJ, INTF, METHOD, CB, DATA, ARGS, ...) \
epc_dbus_call_simple_async(SYSTEMD_SERVICE, OBJ, INTF, METHOD, CB, DATA, \
diff --git a/src/action/unit_start.c b/src/action/unit_start.c
index d8ff515..8db5ebd 100644
--- a/src/action/unit_start.c
+++ b/src/action/unit_start.c
@@ -24,11 +24,12 @@
#include "systemd_dbus.h"
#include "common.h"
+#include <libsyscommon/dbus-system.h>
+
struct unit_action_data {
struct action_executed_event *exe_info;
bool wait_for_unit;
char *job;
- sd_bus_slot *slot;
};
static int finish_action(struct unit_action_data *data, int result, const char *err_msg)
@@ -50,7 +51,13 @@ static int finish_action(struct unit_action_data *data, int result, const char *
return ret;
}
-static int on_job_removed(sd_bus_message *m, void *userdata, sd_bus_error *ret_error)
+static void on_job_removed(GDBusConnection *connection,
+ const gchar *sender_name,
+ const gchar *object_path,
+ const gchar *interface_name,
+ const gchar *signal_name,
+ GVariant *parameters,
+ gpointer userdata)
{
struct unit_action_data *data = userdata;
char *job;
@@ -59,11 +66,7 @@ static int on_job_removed(sd_bus_message *m, void *userdata, sd_bus_error *ret_e
if (!data)
return -EINVAL;
- ret = sd_bus_message_read(m, "uoss", NULL, &job, NULL, NULL);
- if (ret < 0) {
- log_error("Could not read JobRemoved signal");
- return -EINVAL;
- }
+ g_variant_get(parameters, "(uoss)", NULL, &job, NULL, NULL);
if (strcmp(data->job, job) == 0)
finish_action(data, 0, NULL);
@@ -71,33 +74,29 @@ static int on_job_removed(sd_bus_message *m, void *userdata, sd_bus_error *ret_e
return 0;
}
-static int unit_action_handler(sd_bus_message *m, void *userdata, sd_bus_error *ret_error)
+
+static int unit_action_handler(GVariant *var, void *userdata, GError *err)
{
struct unit_action_data *data = userdata;
- _cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
+ dbus_handle_h bus;
int ret;
char *s;
- if (sd_bus_message_is_method_error(m, NULL)) {
- ret = sd_bus_message_read(m, "s", &s);
- if (ret < 0)
- s = NULL;
- return finish_action(data, -sd_bus_message_get_errno(m), s);
- }
+ if (err)
+ return finish_action(data, -err->code, err->message);
if (!data)
return -EINVAL;
- ret = epc_acquire_systemd_bus(&bus);
- if (ret < 0)
- return finish_action(data, ret, "Could not acquire systemd bus");
+ bus = dbus_handle_get_connection(G_BUS_TYPE_SYSTEM, 0);
+ if (!bus)
+ return finish_action(data, -EINVAL, "Could not acquire systemd bus");
if (data->wait_for_unit) {
- ret = sd_bus_add_match(bus, &data->slot,
- "type='signal',sender='org.freedesktop.systemd1',"
- "interface='org.freedesktop.systemd1.Manager',"
- "member='JobRemoved',"
- "path_namespace='/org/freedesktop/systemd1'",
+ ret = subscribe_dbus_signal(bus, NULL,
+ "sender='org.freedesktop.systemd1",
+ "org.freedesktop.systemd1.Manager",
+ "JobRemoved",
on_job_removed,
data);
if (ret < 0) {
@@ -162,7 +161,7 @@ static int start_unit(struct epc_action *action,
unit_action,
unit_action_handler,
data,
- "ss",
+ "(ss)",
unit_name,
"replace");
if (ret < 0)
diff --git a/src/util/systemd_dbus.c b/src/util/systemd_dbus.c
index 712ac33..6a18318 100644
--- a/src/util/systemd_dbus.c
+++ b/src/util/systemd_dbus.c
@@ -21,6 +21,7 @@
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
+#include <libsyscommon/dbus-system.h>
#include "common.h"
#include "systemd_dbus.h"
@@ -30,72 +31,49 @@ static sd_bus *systemd_bus = NULL;
static bool epc_systemd_private = false;
int epc_dbus_call_async(char *service, char *obj, char *interface, char *method,
- sd_bus_error *error, epc_dbus_handler_t cb,
+ epc_dbus_handler_t cb,
void *user_data, char *types, ...)
{
- _cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
- _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
+ dbus_handle_h bus = NULL;
int ret;
+ GVariant *var = NULL;
- ret = epc_acquire_systemd_bus(&bus);
- if (ret < 0)
- return ret;
+ bus = dbus_handle_get_connection(G_BUS_TYPE_SYSTEM, 0);
+ if (!bus)
+ return -EINVAL;
- ret = sd_bus_message_new_method_call(bus, &m, service, obj, interface, method);
- if (ret < 0)
- goto fail;
if (types) {
va_list args;
va_start(args, types);
- ret = sd_bus_message_appendv(m, types, args);
+ var = g_variant_new_va(types, NULL, &args);
va_end(args);
- if (ret < 0)
- goto fail;
}
- return sd_bus_call_async(bus, NULL, m, cb, user_data, 0);
-
-fail:
- return ret;
+ return dbus_handle_method_async_with_reply_var(service, obj, interface, method, var, cb, -1, user_data);
}
int epc_dbus_call(char *service, char *obj, char *interface, char *method,
- sd_bus_error *error, sd_bus_message **out_msg,
char *types, ...)
{
- _cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
- _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
- _cleanup_(sd_bus_error_free) sd_bus_error error_buf = SD_BUS_ERROR_NULL;
+ dbus_handle_h bus = NULL;
int ret;
+ GVariant *var = NULL;
- if (!error)
- error = &error_buf;
-
- ret = epc_acquire_systemd_bus(&bus);
- if (ret < 0)
- return ret;
-
- ret = sd_bus_message_new_method_call(bus, &m, service,
- obj, interface, method);
- if (ret < 0)
- goto fail;
+ bus = dbus_handle_get_connection(G_BUS_TYPE_SYSTEM, 0);
+ if (!bus)
+ return -EINVAL;
if (types) {
va_list args;
va_start(args, types);
- ret = sd_bus_message_appendv(m, types, args);
+ var = g_variant_new(types, NULL, args);
va_end(args);
- if (ret < 0)
- goto fail;
}
- return sd_bus_call(bus, m, 0, error, out_msg);
-
-fail:
- return sd_bus_error_set_errno(error, ret);
+ return dbus_handle_method_sync_var(service, obj, interface, method, var);
}
static int get_bus_by_address(const char *addr, sd_bus **bus)