#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);
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)
#define _EPC_DBUS_SIGNAL_EVENT_H
#include <time.h>
+#include <glib.h>
#include "event.h"
#define DBUS_SIGNAL_EVENT_ID "dbus_signal"
char *path;
char *path_namespace;
char *destination;
- struct epc_object *params;
+ struct epc_object *match_params;
+ GVariant *signal_params;
};
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) \
#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>
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;
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);
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");
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;
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;
}
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;
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;
}
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);
}
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 = {
static int parse_message_args(GVariant *m, struct epc_object *params)
{
int r;
- const char *contents;
int pos = 0;
GVariantIter iter;
GVariant *child;
r = append_param(params, TYPE_DOUBLE, pos, &v);
} else {
r = 0;
- log_warning("Unsupported data type");
}
if (r < 0)
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;
// 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.");
if (ret)
log_error_errno(ret, "Unable to report event: %m");
- return ;
+ return;
finish:
free(ds_ev_data.event_id);
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)
{
int ret;
struct dbus_signal *s;
- int size;
- char err[512];
s = calloc(1, sizeof(*s));
if (!s) {
int ret = 0, len, i;
json_object *arr, *obj;
dbus_handle_h bus;
- char err[512];
INIT_LIST_HEAD(&listener->signals);