X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flogind-user.c;h=177e88200a9f49d4309a1dd621eb496faffe2aa5;hb=88bb8d215aa0f5576eb3f9c77c30cdc4b17783fe;hp=8ebd6eca235b1a3e7803006872ed13b50d46294d;hpb=98a28fef2618e54a644614c759f371f297381b70;p=elogind.git diff --git a/src/logind-user.c b/src/logind-user.c index 8ebd6eca2..177e88200 100644 --- a/src/logind-user.c +++ b/src/logind-user.c @@ -94,6 +94,9 @@ int user_save(User *u) { assert(u); assert(u->state_file); + if (!u->started) + return 0; + r = safe_mkdir("/run/systemd/users", 0755, 0, 0); if (r < 0) goto finish; @@ -177,7 +180,7 @@ int user_load(User *u) { free(display); } - if (s && s->display && x11_display_is_local(s->display)) + if (s && s->display && display_is_local(s->display)) u->display = s; return r; @@ -234,9 +237,9 @@ static int user_create_cgroup(User *u) { r = cg_create(SYSTEMD_CGROUP_CONTROLLER, p); if (r < 0) { + log_error("Failed to create cgroup "SYSTEMD_CGROUP_CONTROLLER":%s: %s", p, strerror(-r)); free(p); u->cgroup_path = NULL; - log_error("Failed to create cgroup "SYSTEMD_CGROUP_CONTROLLER":%s: %s", p, strerror(-r)); return r; } @@ -265,6 +268,8 @@ int user_start(User *u) { if (u->started) return 0; + log_info("New user %s logged in.", u->name); + /* Make XDG_RUNTIME_DIR */ r = user_mkdir_runtime_path(u); if (r < 0) @@ -280,13 +285,13 @@ int user_start(User *u) { if (r < 0) return r; - /* Save new user data */ - user_save(u); - dual_timestamp_get(&u->timestamp); u->started = true; + /* Save new user data */ + user_save(u); + user_send_signal(u, true); return 0; @@ -304,7 +309,16 @@ static int user_stop_service(User *u) { static int user_shall_kill(User *u) { assert(u); - return u->manager->kill_user_processes; + if (!u->manager->kill_user_processes) + return false; + + if (strv_contains(u->manager->kill_exclude_users, u->name)) + return false; + + if (strv_isempty(u->manager->kill_only_users)) + return true; + + return strv_contains(u->manager->kill_only_users, u->name); } static int user_kill_cgroup(User *u) { @@ -368,8 +382,8 @@ int user_stop(User *u) { int r = 0, k; assert(u); - if (!u->started) - return 0; + if (u->started) + log_info("User %s logged out.", u->name); LIST_FOREACH(sessions_by_user, s, u->sessions) { k = session_stop(s); @@ -377,8 +391,6 @@ int user_stop(User *u) { r = k; } - user_send_signal(u, false); - /* Kill systemd */ k = user_stop_service(u); if (k < 0) @@ -397,6 +409,9 @@ int user_stop(User *u) { unlink(u->state_file); user_add_to_gc_queue(u); + if (u->started) + user_send_signal(u, false); + u->started = false; return r;