diff options
author | Maciej Slodczyk <m.slodczyk2@partner.samsung.com> | 2019-08-20 17:09:50 +0200 |
---|---|---|
committer | Karol Lewandowski <k.lewandowsk@samsung.com> | 2019-08-22 16:51:48 +0200 |
commit | ed125f4a4a9952d49ac87be7686af86edf7a6593 (patch) | |
tree | 78dc9e9daf9e9eba51c80c799ca331ea1f064460 | |
parent | ea2b8d5c2d274def91c97608667ddadcaa77d6fb (diff) | |
download | activationd-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.h | 3 | ||||
-rw-r--r-- | include/dbus_signal_event.h | 7 | ||||
-rw-r--r-- | src/action/forward_signal.c | 20 | ||||
-rw-r--r-- | src/core/action.c | 4 | ||||
-rw-r--r-- | src/decision_makers/activation_dm.c | 6 | ||||
-rw-r--r-- | src/event_types/dbus_signal_event.c | 17 | ||||
-rw-r--r-- | src/listeners/dbus.c | 22 |
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); |