summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaciej Slodczyk <m.slodczyk2@partner.samsung.com>2019-08-20 17:09:50 +0200
committerKarol Lewandowski <k.lewandowsk@samsung.com>2019-08-22 16:51:48 +0200
commited125f4a4a9952d49ac87be7686af86edf7a6593 (patch)
tree78dc9e9daf9e9eba51c80c799ca331ea1f064460
parentea2b8d5c2d274def91c97608667ddadcaa77d6fb (diff)
downloadactivationd-ed125f4a4a9952d49ac87be7686af86edf7a6593.tar.gz
activationd-ed125f4a4a9952d49ac87be7686af86edf7a6593.tar.bz2
activationd-ed125f4a4a9952d49ac87be7686af86edf7a6593.zip
signal forward: pass broadcast signal parameters
Change-Id: I608faeeac606f113130449825f8e2348c07f6900 Signed-off-by: Maciej Slodczyk <m.slodczyk2@partner.samsung.com>
-rw-r--r--include/action.h3
-rw-r--r--include/dbus_signal_event.h7
-rw-r--r--src/action/forward_signal.c20
-rw-r--r--src/core/action.c4
-rw-r--r--src/decision_makers/activation_dm.c6
-rw-r--r--src/event_types/dbus_signal_event.c17
-rw-r--r--src/listeners/dbus.c22
7 files changed, 42 insertions, 37 deletions
diff --git a/include/action.h b/include/action.h
index 7c0a3fd..a61b0fe 100644
--- a/include/action.h
+++ b/include/action.h
@@ -39,7 +39,6 @@
#define EPC_AD_SIGNAL_PATH "SignalPath"
#define EPC_AD_SIGNAL_INTERFACE "SignalInterface"
#define EPC_AD_SIGNAL_MEMBER "SignalMember"
-#define EPC_AD_SIGNAL_PARAMS "SignalParams"
int epc_fill_for_srv_restart(struct epc_object *obj, const char *service_path);
@@ -50,7 +49,7 @@ int epc_fill_for_unit_action(struct epc_object *obj, const char *action);
int epc_fill_for_signal_forward(struct epc_object *obj, const char *dest,
const char *objpath, const char *interface,
- const char *member, struct epc_object *params);
+ const char *member);
#define epc_fill_for_reboot(o) \
epc_object_fill_empty(o)
diff --git a/include/dbus_signal_event.h b/include/dbus_signal_event.h
index 039770d..4d2345d 100644
--- a/include/dbus_signal_event.h
+++ b/include/dbus_signal_event.h
@@ -20,6 +20,7 @@
#define _EPC_DBUS_SIGNAL_EVENT_H
#include <time.h>
+#include <glib.h>
#include "event.h"
#define DBUS_SIGNAL_EVENT_ID "dbus_signal"
@@ -43,7 +44,8 @@ struct dbus_signal_event {
char *path;
char *path_namespace;
char *destination;
- struct epc_object *params;
+ struct epc_object *match_params;
+ GVariant *signal_params;
};
struct dbus_signal_event_data {
@@ -55,7 +57,8 @@ struct dbus_signal_event_data {
char *path;
char *path_namespace;
char *destination;
- struct epc_object *params;
+ struct epc_object *match_params;
+ GVariant *signal_params;
};
#define to_dbus_signal_event(EVENT) \
diff --git a/src/action/forward_signal.c b/src/action/forward_signal.c
index f38c776..6c5a253 100644
--- a/src/action/forward_signal.c
+++ b/src/action/forward_signal.c
@@ -22,6 +22,7 @@
#include "unit_control_event.h"
#include "log.h"
#include "systemd_dbus.h"
+#include "dbus_signal_event.h"
#include "common.h"
#include <libsyscommon/dbus-system.h>
@@ -36,25 +37,26 @@ static int forward_signal(struct epc_action *action,
char *signal_path = NULL;
char *signal_interface = NULL;
char *signal_member = NULL;
- //FIXME: we need to pass both signature or original signal and their parameters
- // while passing GVariant* directly seems ok, we already have serialized
- // form in module that generates the event, so might try to pass it here
- // as epc_object (look for ->params in decision_makers/activation_dm)
- //FIXME: signal_params = NULL;
+ GVariant *params = NULL;
+ struct dbus_signal_event *ds_ev = to_dbus_signal_event(dm_ev->reason);
+
exe_info->reason = ev;
+ if (ds_ev)
+ params = ds_ev->signal_params;
+
epc_object_get_string(dm_ev->action_data, EPC_AD_SIGNAL_ACTION, &signal_action);
epc_object_get_string(dm_ev->action_data, EPC_AD_SIGNAL_DEST, &signal_dest);
epc_object_get_string(dm_ev->action_data, EPC_AD_SIGNAL_PATH, &signal_path);
epc_object_get_string(dm_ev->action_data, EPC_AD_SIGNAL_INTERFACE, &signal_interface);
epc_object_get_string(dm_ev->action_data, EPC_AD_SIGNAL_MEMBER, &signal_member);
- log_debug("forward_signal: action %s, dest %s, path %s, interface %s, member %s",
- signal_action, signal_dest, signal_path, signal_interface, signal_member);
- //FIXME: epc_object_get_object(dm_ev->action_data, EPC_AD_SIGNAL_PARAMS, &signal_params);
+ log_debug("forward_signal: action %s, dest %s, path %s, interface %s, member %s, params: %s",
+ signal_action, signal_dest, signal_path, signal_interface, signal_member, g_variant_print(params, TRUE));
+
if (!signal_dest || !signal_path || !signal_interface || !signal_member)
goto err;
- dbus_handle_broadcast_dbus_signal(signal_dest, signal_path, signal_interface, signal_member, NULL);
+ dbus_handle_broadcast_dbus_signal(signal_dest, signal_path, signal_interface, signal_member, params);
exe_info->result = 0;
return 0;
diff --git a/src/core/action.c b/src/core/action.c
index 4b1eed0..d185e1b 100644
--- a/src/core/action.c
+++ b/src/core/action.c
@@ -89,7 +89,7 @@ int epc_fill_for_unit_action(struct epc_object *obj, const char *unit_action)
int epc_fill_for_signal_forward(struct epc_object *obj, const char *dest,
const char *path, const char *interface,
- const char *member, struct epc_object *params)
+ const char *member)
{
assert(dest);
assert(path);
@@ -102,8 +102,6 @@ int epc_fill_for_signal_forward(struct epc_object *obj, const char *dest,
ret += epc_object_append_string(obj, EPC_AD_SIGNAL_PATH, path);
ret += epc_object_append_string(obj, EPC_AD_SIGNAL_INTERFACE, interface);
ret += epc_object_append_string(obj, EPC_AD_SIGNAL_MEMBER, member);
- if (params)
- ret += epc_object_append_object(obj, EPC_AD_SIGNAL_PARAMS, params);
if (ret != 0) {
log_error("Unable to append parameters for forward_signal");
diff --git a/src/decision_makers/activation_dm.c b/src/decision_makers/activation_dm.c
index 713657b..1da7c41 100644
--- a/src/decision_makers/activation_dm.c
+++ b/src/decision_makers/activation_dm.c
@@ -145,7 +145,7 @@ static int dbus_rule_match(struct rule *r, struct epc_event *event)
if (ev_data->event_id && strcmp(ev_data->event_id, ev->event_id))
return 0;
- if (ev->params && r->match && !epc_object_match_pattern(ev->params, r->match))
+ if (ev->match_params && r->match && !epc_object_match_pattern(ev->match_params, r->match))
return 0;
return 1;
@@ -171,9 +171,7 @@ static int execute_rule_signal(struct rule *r, struct epc_event *ev, struct dm_e
ev_data->action = EPC_ACTION_DBUS_SIGNAL_FORWARD_ID;
if (epc_fill_for_signal_forward(ev_data->action_data, r->target,
- dev->path, dev->interface, dev->member,
- NULL /* FIXME not supported yet (dev->params) */)) {
- // FIXME note that dev->params already has parameters that need to be passed as epc_object
+ dev->path, dev->interface, dev->member)) {
log_error("Unable to create event data");
return -1;
}
diff --git a/src/event_types/dbus_signal_event.c b/src/event_types/dbus_signal_event.c
index 611aac6..c556880 100644
--- a/src/event_types/dbus_signal_event.c
+++ b/src/event_types/dbus_signal_event.c
@@ -45,7 +45,8 @@ static int allocate_dbus_signal_event(struct epc_event_type *type,
ds_ev->path = ds_ev_data->path;
ds_ev->path_namespace = ds_ev_data->path_namespace;
ds_ev->destination = ds_ev_data->destination;
- ds_ev->params = ds_ev_data->params;
+ ds_ev->match_params = ds_ev_data->match_params;
+ ds_ev->signal_params = ds_ev_data->signal_params;
*ev = &ds_ev->event;
return 0;
@@ -88,7 +89,7 @@ static int deserialize_dbus_signal_event(struct epc_event_type *type,
case TYPE_OBJECT:
if (!strcmp(DS_EV_PARAMS, obj->key)) {
epc_object_ref(obj);
- ds_ev_data.params = obj;
+ ds_ev_data.match_params = obj;
}
break;
}
@@ -122,8 +123,12 @@ static void dbus_signal_event_release(struct epc_event *ev)
free(ds_ev->path);
free(ds_ev->path_namespace);
free(ds_ev->destination);
- if (ds_ev->params)
- epc_object_destroy(ds_ev->params);
+ if (ds_ev->match_params)
+ epc_object_destroy(ds_ev->match_params);
+
+ if (ds_ev->signal_params)
+ g_variant_unref(ds_ev->signal_params);
+
epc_event_cleanup_internal(&ds_ev->event);
free(ds_ev);
}
@@ -147,8 +152,8 @@ static void dbus_signal_event_serialize(struct epc_event *ev, struct epc_object
epc_object_append_string(out, DS_EV_PATH_NAMESPACE, ds_ev->path_namespace);
if (ds_ev->destination)
epc_object_append_string(out, DS_EV_DESTINATION, ds_ev->destination);
- if (ds_ev->params)
- epc_object_append_object(out, DS_EV_PARAMS, ds_ev->params);
+ if (ds_ev->match_params)
+ epc_object_append_object(out, DS_EV_PARAMS, ds_ev->match_params);
}
static struct epc_event_type dbus_signal_event_type = {
diff --git a/src/listeners/dbus.c b/src/listeners/dbus.c
index ccf09dc..ad74b84 100644
--- a/src/listeners/dbus.c
+++ b/src/listeners/dbus.c
@@ -73,7 +73,6 @@ static int append_param(struct epc_object *params, enum epc_object_type type, in
static int parse_message_args(GVariant *m, struct epc_object *params)
{
int r;
- const char *contents;
int pos = 0;
GVariantIter iter;
GVariant *child;
@@ -123,7 +122,6 @@ static int parse_message_args(GVariant *m, struct epc_object *params)
r = append_param(params, TYPE_DOUBLE, pos, &v);
} else {
r = 0;
- log_warning("Unsupported data type");
}
if (r < 0)
@@ -151,7 +149,7 @@ static void on_dbus_signal_match(GDBusConnection *connection,
if (clock_gettime(CLOCK_MONOTONIC, &ts) < 0) {
log_error_errno(errno, "Unable to get timestamp : %m");
- return ;
+ return;
}
ds_ev_data.event_time = ts.tv_sec;
@@ -182,15 +180,20 @@ static void on_dbus_signal_match(GDBusConnection *connection,
// XXX handle individual errors
goto finish;
- if (epc_object_new(&ds_ev_data.params) < 0)
+ if (epc_object_new(&ds_ev_data.match_params) < 0)
goto finish;
- ret = parse_message_args(parameters, ds_ev_data.params);
+ ret = parse_message_args(parameters, ds_ev_data.match_params);
if (ret) {
log_error_errno(ret, "Unable to parse signal parameters: %m.");
goto finish;
}
+ if(parameters) {
+ g_variant_ref(parameters);
+ ds_ev_data.signal_params = parameters;
+ }
+
ret = epc_event_create(DBUS_SIGNAL_EVENT_ID, &ds_ev_data, &ev);
if (ret) {
log_error_errno(ret, "Unable to allocate an event: %m.");
@@ -202,7 +205,7 @@ static void on_dbus_signal_match(GDBusConnection *connection,
if (ret)
log_error_errno(ret, "Unable to report event: %m");
- return ;
+ return;
finish:
free(ds_ev_data.event_id);
@@ -212,8 +215,8 @@ finish:
free(ds_ev_data.path);
free(ds_ev_data.path_namespace);
free(ds_ev_data.destination);
- if (ds_ev_data.params)
- epc_object_destroy(ds_ev_data.params);
+ if (ds_ev_data.match_params)
+ epc_object_destroy(ds_ev_data.match_params);
}
static void signal_cleanup(struct dbus_signal *s)
@@ -243,8 +246,6 @@ static int add_signal(struct dbus_listener *l, json_object *root, dbus_handle_h
{
int ret;
struct dbus_signal *s;
- int size;
- char err[512];
s = calloc(1, sizeof(*s));
if (!s) {
@@ -299,7 +300,6 @@ static int dbus_listener_init(struct epc_module *module,
int ret = 0, len, i;
json_object *arr, *obj;
dbus_handle_h bus;
- char err[512];
INIT_LIST_HEAD(&listener->signals);