signal forward: pass broadcast signal parameters 59/212359/3
authorMaciej Slodczyk <m.slodczyk2@partner.samsung.com>
Tue, 20 Aug 2019 15:09:50 +0000 (17:09 +0200)
committerKarol Lewandowski <k.lewandowsk@samsung.com>
Thu, 22 Aug 2019 14:51:48 +0000 (16:51 +0200)
Change-Id: I608faeeac606f113130449825f8e2348c07f6900
Signed-off-by: Maciej Slodczyk <m.slodczyk2@partner.samsung.com>
include/action.h
include/dbus_signal_event.h
src/action/forward_signal.c
src/core/action.c
src/decision_makers/activation_dm.c
src/event_types/dbus_signal_event.c
src/listeners/dbus.c

index 7c0a3fdf6dc91a92da2db8c6d0969872c26b976f..a61b0fec240e07e4b813e91f564aa1cbbb238766 100644 (file)
@@ -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)
index 039770da26bbb87dc4163e40476da2b23bc85b32..4d2345d43ae96c52b456e06daac7b2cb36e232a9 100644 (file)
@@ -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)                                            \
index f38c77639ef4caf6a471fcf9efc3ebce42d2959c..6c5a253546533090d73d165963b43f9f3942bdb1 100644 (file)
@@ -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;
index 4b1eed0f99b7ac0ac0eb0b27d136106c09197fe9..d185e1bb6dc518ef05a2faf14db071cff75baad8 100644 (file)
@@ -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");
index 713657bf56222509c4d3af64bcfb89bc5dcebd16..1da7c410ff081226df9a8993aec9f2b630818012 100644 (file)
@@ -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;
        }
index 611aac68c88be9defa4eb2f0b071fe5c62fb068d..c55688005cc25ae8b906a58604ef908db6a91e59 100644 (file)
@@ -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 = {
index ccf09dcf1a878ac43078f85f516120dcae326497..ad74b84a9641db05a37f3bd9f342d1ad42789f35 100644 (file)
@@ -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);