From e8b212fe56f7f4e1778474777a7a2959244d0047 Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Tue, 17 Sep 2013 17:39:55 +0200 Subject: logind: add infrastructure to watch busnames If we want to track bus-names to allow exclusive resource-access, we need a way to get notified when a bus-name is gone. We make logind watch for NameOwnerChanged dbus events and check whether the name is currently watched. If it is, we remove it from the watch-list (notification for other objects can be added in follow-up patches). --- src/login/logind-dbus.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'src/login/logind-dbus.c') diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c index d052e74789..5decf8114c 100644 --- a/src/login/logind-dbus.c +++ b/src/login/logind-dbus.c @@ -2459,6 +2459,23 @@ DBusHandlerResult bus_message_filter( HASHMAP_FOREACH(session, m->sessions, i) session_add_to_gc_queue(session); } + + } else if (dbus_message_is_signal(message, DBUS_INTERFACE_DBUS, "NameOwnerChanged")) { + const char *name, *old, *new; + char *key; + + if (!dbus_message_get_args(message, &error, + DBUS_TYPE_STRING, &name, + DBUS_TYPE_STRING, &old, + DBUS_TYPE_STRING, &new, + DBUS_TYPE_INVALID)) { + log_error("Failed to parse NameOwnerChanged message: %s", bus_error_message(&error)); + goto finish; + } + + if (*old && !*new && (key = hashmap_remove(m->busnames, old))) { + free(key); + } } finish: -- cgit v1.2.3-54-g00ecf