[vdagent-linux v2 6/6] console-kit: include handler for dbus match

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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.
---
 src/console-kit.c | 65 +++++++++++++++++++++++++++++++++++++++++++------------
 1 file changed, 51 insertions(+), 14 deletions(-)

diff --git a/src/console-kit.c b/src/console-kit.c
index 41a1cfe..f3c4aa3 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,54 @@ struct session_info {
 static char *console_kit_get_first_seat(struct session_info *si);
 static char *console_kit_check_active_session_change(struct session_info *si);
 
+static void si_dbus_match_remove(struct session_info *si)
+{
+    DBusError error;
+    if (si->match_seat_signals != NULL) {
+        dbus_error_init(&error);
+        dbus_bus_remove_match(si->connection,
+                              si->match_seat_signals,
+                              &error);
+        if (si->verbose)
+            syslog(LOG_DEBUG, "(console-kit) seat match removed: %s",
+                   si->match_seat_signals);
+        g_free(si->match_seat_signals);
+    }
+}
+
+static void si_dbus_match_rule_update(struct session_info *si)
+{
+    DBusError error;
+
+    if (si->connection == NULL)
+        return;
+
+    si_dbus_match_remove(si);
+
+    /* Seat signals */
+    if (si->seat != NULL) {
+        si->match_seat_signals =
+            g_strdup_printf ("type='signal',interface='%s',path='%s',"
+                             "member='ActiveSessionChanged'",
+                             INTERFACE_CK_SEAT,
+                             si->seat);
+        if (si->verbose)
+            syslog(LOG_DEBUG, "(console-kit) seat match: %s",
+                   si->match_seat_signals);
+
+        dbus_error_init(&error);
+        dbus_bus_add_match(si->connection,
+                           si->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(si->match_seat_signals);
+        }
+    }
+}
+
 static void
 si_dbus_read_signals(struct session_info *si)
 {
@@ -106,7 +155,6 @@ struct session_info *session_info_create(int verbose)
 {
     struct session_info *si;
     DBusError error;
-    char match[1024];
 
     si = calloc(1, sizeof(*si));
     if (!si)
@@ -138,19 +186,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_CK_SEAT, si->seat);
-    dbus_error_init(&error);
-    dbus_bus_add_match(si->connection, match, &error);
-    if (dbus_error_is_set(&error)) {
-        syslog(LOG_ERR, "Match Error (%s)", error.message);
-        session_info_destroy(si);
-        return NULL;
-    }
-
+    si_dbus_match_rule_update(si);
     return si;
 }
 
@@ -159,6 +195,7 @@ void session_info_destroy(struct session_info *si)
     if (!si)
         return;
 
+    si_dbus_match_remove(si);
     dbus_connection_close(si->connection);
     free(si->seat);
     free(si->active_session);
-- 
2.5.5

_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/spice-devel




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]