summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVictor Toso <victortoso@redhat.com>2016-04-12 09:48:47 +0200
committerVictor Toso <victortoso@redhat.com>2016-04-28 23:01:54 +0200
commitb1b8b71961b9a28cc4896e9973d3a3c1975ead39 (patch)
tree056a3109079ec0f4ff996f0f798618a25bbdebe5
parent4c1c73cf74035f452f3a59674417ad9be0988f7f (diff)
console-kit: include handler for dbus match
At the moment we request to read signals on ConsoleKit.Seat interface but later on we will request to read signals on different interface so moving this to its own function helps. Signed-off-by: Victor Toso <victortoso@redhat.com> Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
-rw-r--r--src/console-kit.c66
1 files changed, 52 insertions, 14 deletions
diff --git a/src/console-kit.c b/src/console-kit.c
index 46b4df5..d4eecd7 100644
--- a/src/console-kit.c
+++ b/src/console-kit.c
@@ -34,6 +34,7 @@ struct session_info {
char *seat;
char *active_session;
int verbose;
+ gchar *match_seat_signals;
};
#define INTERFACE_CONSOLE_KIT "org.freedesktop.ConsoleKit"
@@ -49,6 +50,55 @@ struct session_info {
static char *console_kit_get_first_seat(struct session_info *info);
static char *console_kit_check_active_session_change(struct session_info *info);
+static void si_dbus_match_remove(struct session_info *info)
+{
+ DBusError error;
+ if (info->match_seat_signals != NULL) {
+ dbus_error_init(&error);
+ dbus_bus_remove_match(info->connection,
+ info->match_seat_signals,
+ &error);
+ if (info->verbose)
+ syslog(LOG_DEBUG, "(console-kit) seat match removed: %s",
+ info->match_seat_signals);
+ g_free(info->match_seat_signals);
+ info->match_seat_signals = NULL;
+ }
+}
+
+static void si_dbus_match_rule_update(struct session_info *info)
+{
+ DBusError error;
+
+ if (info->connection == NULL)
+ return;
+
+ si_dbus_match_remove(info);
+
+ /* Seat signals */
+ if (info->seat != NULL) {
+ info->match_seat_signals =
+ g_strdup_printf ("type='signal',interface='%s',path='%s',"
+ "member='ActiveSessionChanged'",
+ INTERFACE_CONSOLE_KIT_SEAT,
+ info->seat);
+ if (info->verbose)
+ syslog(LOG_DEBUG, "(console-kit) seat match: %s",
+ info->match_seat_signals);
+
+ dbus_error_init(&error);
+ dbus_bus_add_match(info->connection,
+ info->match_seat_signals,
+ &error);
+ if (dbus_error_is_set(&error)) {
+ syslog(LOG_WARNING, "Unable to add dbus rule match: %s",
+ error.message);
+ dbus_error_free(&error);
+ g_free(info->match_seat_signals);
+ }
+ }
+}
+
static void
si_dbus_read_signals(struct session_info *info)
{
@@ -106,7 +156,6 @@ struct session_info *session_info_create(int verbose)
{
struct session_info *info;
DBusError error;
- char match[1024];
info = calloc(1, sizeof(*info));
if (!info)
@@ -138,19 +187,7 @@ struct session_info *session_info_create(int verbose)
return NULL;
}
- /* Register for active session changes */
- snprintf(match, sizeof(match),
- "type='signal',interface='%s',"
- "path='%s',member='ActiveSessionChanged'",
- INTERFACE_CONSOLE_KIT_SEAT, info->seat);
- dbus_error_init(&error);
- dbus_bus_add_match(info->connection, match, &error);
- if (dbus_error_is_set(&error)) {
- syslog(LOG_ERR, "Match Error (%s)", error.message);
- session_info_destroy(info);
- return NULL;
- }
-
+ si_dbus_match_rule_update(info);
return info;
}
@@ -159,6 +196,7 @@ void session_info_destroy(struct session_info *info)
if (!info)
return;
+ si_dbus_match_remove(info);
dbus_connection_close(info->connection);
free(info->seat);
free(info->active_session);