X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flogind.c;h=f96ace2315734b4dcd99b14a2d8c6f015cc369e6;hp=d7d04a2c53ddfa07e435da0fd2b2e62c0bf7b5a0;hb=7a41c61168632501489a4d054619b86f529a02e7;hpb=4fa4c2ac6ecb064c2a6c8677f7660534002f8cfe diff --git a/src/logind.c b/src/logind.c index d7d04a2c5..f96ace231 100644 --- a/src/logind.c +++ b/src/logind.c @@ -286,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)) { @@ -451,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; @@ -564,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); @@ -975,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; @@ -986,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); } @@ -996,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); } @@ -1006,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); } @@ -1090,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); @@ -1110,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) {