X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flogind.c;h=f96ace2315734b4dcd99b14a2d8c6f015cc369e6;hb=74b91131ed09850ed487a2f7849147ff6f80194d;hp=fd17d80541e8dbd02fe28d454456dc48292bec7f;hpb=193197e85ccc5622abd9653dcd939712334d3ea3;p=elogind.git diff --git a/src/logind.c b/src/logind.c index fd17d8054..f96ace231 100644 --- a/src/logind.c +++ b/src/logind.c @@ -56,7 +56,14 @@ Manager *manager_new(void) { m->cgroups = hashmap_new(string_hash_func, string_compare_func); m->fifo_fds = hashmap_new(trivial_hash_func, trivial_compare_func); - if (!m->devices || !m->seats || !m->sessions || !m->users) { + if (!m->devices || !m->seats || !m->sessions || !m->users || !m->cgroups || !m->fifo_fds) { + manager_free(m); + return NULL; + } + + m->reset_controllers = strv_new("cpu", NULL); + m->kill_exclude_users = strv_new("root", NULL); + if (!m->reset_controllers || !m->kill_exclude_users) { manager_free(m); return NULL; } @@ -264,11 +271,6 @@ int manager_process_seat_device(Manager *m, struct udev_device *d) { assert(m); - /* FIXME: drop this check as soon as libudev's enum support - * honours tags and subsystem matches at the same time */ - if (!streq_ptr(udev_device_get_subsystem(d), "graphics")) - return 0; - if (streq_ptr(udev_device_get_action(d), "remove")) { /* FIXME: use syspath instead of sysname here, as soon as fb driver is fixed */ @@ -284,7 +286,7 @@ int manager_process_seat_device(Manager *m, struct udev_device *d) { Seat *seat; sn = udev_device_get_property_value(d, "ID_SEAT"); - if (!sn) + if (isempty(sn)) sn = "seat0"; if (!seat_name_is_valid(sn)) { @@ -449,7 +451,6 @@ static int manager_enumerate_users_from_cgroup(Manager *m) { return r; } - static int manager_enumerate_linger_users(Manager *m) { DIR *d; struct dirent *de; @@ -562,6 +563,9 @@ static int manager_enumerate_sessions_from_cgroup(Manager *m) { while ((k = cg_read_subgroup(d, &name)) > 0) { Session *session; + if (streq(name, "shared")) + continue; + k = manager_add_session(m, u, name, &session); if (k < 0) { free(name); @@ -973,7 +977,7 @@ static int manager_connect_udev(Manager *m) { return 0; } -void manager_gc(Manager *m) { +void manager_gc(Manager *m, bool drop_not_started) { Seat *seat; Session *session; User *user; @@ -984,7 +988,7 @@ void manager_gc(Manager *m) { LIST_REMOVE(Seat, gc_queue, m->seat_gc_queue, seat); seat->in_gc_queue = false; - if (seat_check_gc(seat) == 0) { + if (seat_check_gc(seat, drop_not_started) == 0) { seat_stop(seat); seat_free(seat); } @@ -994,7 +998,7 @@ void manager_gc(Manager *m) { LIST_REMOVE(Session, gc_queue, m->session_gc_queue, session); session->in_gc_queue = false; - if (session_check_gc(session) == 0) { + if (session_check_gc(session, drop_not_started) == 0) { session_stop(session); session_free(session); } @@ -1004,7 +1008,7 @@ void manager_gc(Manager *m) { LIST_REMOVE(User, gc_queue, m->user_gc_queue, user); user->in_gc_queue = false; - if (user_check_gc(user) == 0) { + if (user_check_gc(user, drop_not_started) == 0) { user_stop(user); user_free(user); } @@ -1088,6 +1092,9 @@ int manager_startup(Manager *m) { manager_enumerate_users(m); manager_enumerate_sessions(m); + /* Remove stale objects before we start them */ + manager_gc(m, false); + /* And start everything */ HASHMAP_FOREACH(seat, m->seats, i) seat_start(seat); @@ -1108,12 +1115,12 @@ int manager_run(Manager *m) { struct epoll_event event; int n; - manager_gc(m); + manager_gc(m, true); if (dbus_connection_dispatch(m->bus) != DBUS_DISPATCH_COMPLETE) continue; - manager_gc(m); + manager_gc(m, true); n = epoll_wait(m->epoll_fd, &event, 1, -1); if (n < 0) { @@ -1156,7 +1163,7 @@ static int manager_parse_config_file(Manager *m) { const ConfigItem items[] = { { "NAutoVTs", config_parse_unsigned, 0, &m->n_autovts, "Login" }, { "KillUserProcesses", config_parse_bool, 0, &m->kill_user_processes, "Login" }, - { "KilOnlyUsers", config_parse_strv, 0, &m->kill_only_users, "Login" }, + { "KillOnlyUsers", config_parse_strv, 0, &m->kill_only_users, "Login" }, { "KillExcludeUsers", config_parse_strv, 0, &m->kill_exclude_users, "Login" }, { "Controllers", config_parse_strv, 0, &m->controllers, "Login" }, { "ResetControllers", config_parse_strv, 0, &m->reset_controllers, "Login" },