X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;ds=sidebyside;f=src%2Flogin%2Flogind.c;h=9094567b8d91cd7f87d21ac80da9b5a09b522bd7;hb=042f598892e2587d735e4de1f4aabcb3d89d05f1;hp=fcb3ccf4a5e5de3faca3134077e13b56e5a6a498;hpb=943aca8efb39453e3994ccdd1e08534b788c5aee;p=elogind.git diff --git a/src/login/logind.c b/src/login/logind.c index fcb3ccf4a..9094567b8 100644 --- a/src/login/logind.c +++ b/src/login/logind.c @@ -1038,12 +1038,23 @@ static int manager_connect_bus(Manager *m) { "interface='org.freedesktop.DBus.Properties'," "member='PropertiesChanged'", &error); - if (dbus_error_is_set(&error)) { log_error("Failed to add match for PropertiesChanged: %s", bus_error_message(&error)); dbus_error_free(&error); } + dbus_bus_add_match(m->bus, + "type='signal'," + "sender='org.freedesktop.systemd1'," + "interface='org.freedesktop.systemd1.Manager'," + "member='Reloading'," + "path='/org/freedesktop/systemd1'", + &error); + if (dbus_error_is_set(&error)) { + log_error("Failed to add match for Reloading: %s", bus_error_message(&error)); + dbus_error_free(&error); + } + r = bus_method_call_with_reply( m->bus, "org.freedesktop.systemd1", @@ -1233,6 +1244,7 @@ void manager_gc(Manager *m, bool drop_not_started) { if (session_check_gc(session, drop_not_started) == 0) { session_stop(session); + session_finalize(session); session_free(session); } } @@ -1243,6 +1255,7 @@ void manager_gc(Manager *m, bool drop_not_started) { if (user_check_gc(user, drop_not_started) == 0) { user_stop(user); + user_finalize(user); user_free(user); } } @@ -1287,6 +1300,22 @@ int manager_get_idle_hint(Manager *m, dual_timestamp *t) { return idle_hint; } +bool manager_shall_kill(Manager *m, const char *user) { + assert(m); + assert(user); + + if (!m->kill_user_processes) + return false; + + if (strv_contains(m->kill_exclude_users, user)) + return false; + + if (strv_isempty(m->kill_only_users)) + return true; + + return strv_contains(m->kill_only_users, user); +} + int manager_dispatch_idle_action(Manager *m) { struct dual_timestamp since; struct itimerspec its = {}; @@ -1394,12 +1423,29 @@ int manager_startup(Manager *m) { return r; /* Deserialize state */ - manager_enumerate_devices(m); - manager_enumerate_seats(m); - manager_enumerate_users(m); - manager_enumerate_sessions(m); - manager_enumerate_inhibitors(m); - manager_enumerate_buttons(m); + r = manager_enumerate_devices(m); + if (r < 0) + log_warning("Device enumeration failed: %s", strerror(-r)); + + r = manager_enumerate_seats(m); + if (r < 0) + log_warning("Seat enumeration failed: %s", strerror(-r)); + + r = manager_enumerate_users(m); + if (r < 0) + log_warning("User enumeration failed: %s", strerror(-r)); + + r = manager_enumerate_sessions(m); + if (r < 0) + log_warning("Session enumeration failed: %s", strerror(-r)); + + r = manager_enumerate_inhibitors(m); + if (r < 0) + log_warning("Inhibitor enumeration failed: %s", strerror(-r)); + + r = manager_enumerate_buttons(m); + if (r < 0) + log_warning("Button enumeration failed: %s", strerror(-r)); /* Remove stale objects before we start them */ manager_gc(m, false);