X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flogin%2Flogind-user.c;h=fca68159a7c556e43f48c96fde23aeb1beae235c;hb=669241a076108e0483d7d8475beaa506106d077e;hp=8bd773086e11a6653a03122ee328c6b28b25517e;hpb=8c8c43515cee56dfc2298998a9e5958308c46f99;p=elogind.git diff --git a/src/login/logind-user.c b/src/login/logind-user.c index 8bd773086..fca68159a 100644 --- a/src/login/logind-user.c +++ b/src/login/logind-user.c @@ -259,10 +259,8 @@ static int user_mkdir_runtime_path(User *u) { } if (!u->runtime_path) { - p = strappend("/run/user/", u->name); - - if (!p) { - log_error("Out of memory"); + if (asprintf(&p, "/run/user/%lu", (unsigned long) u->uid) < 0) { + log_error("Out of memory."); return -ENOMEM; } } else @@ -289,7 +287,7 @@ static int user_create_cgroup(User *u) { if (!u->cgroup_path) { if (asprintf(&p, "%s/%s", u->manager->cgroup_path, u->name) < 0) { - log_error("Out of memory"); + log_error("Out of memory."); return -ENOMEM; } } else @@ -523,9 +521,21 @@ int user_get_idle_hint(User *u, dual_timestamp *t) { return idle_hint; } +static int user_check_linger_file(User *u) { + char *p; + int r; + + if (asprintf(&p, "/var/lib/systemd/linger/%s", u->name) < 0) + return -ENOMEM; + + r = access(p, F_OK) >= 0; + free(p); + + return r; +} + int user_check_gc(User *u, bool drop_not_started) { int r; - char *p; assert(u); @@ -535,13 +545,7 @@ int user_check_gc(User *u, bool drop_not_started) { if (u->sessions) return 1; - if (asprintf(&p, "/var/lib/systemd/linger/%s", u->name) < 0) - return -ENOMEM; - - r = access(p, F_OK) >= 0; - free(p); - - if (r > 0) + if (user_check_linger_file(u) > 0) return 1; if (u->cgroup_path) { @@ -571,14 +575,17 @@ UserState user_get_state(User *u) { assert(u); - if (!u->sessions) - return USER_LINGERING; - LIST_FOREACH(sessions_by_user, i, u->sessions) if (session_is_active(i)) return USER_ACTIVE; - return USER_ONLINE; + if (u->sessions) + return USER_ONLINE; + + if (user_check_linger_file(u) > 0) + return USER_LINGERING; + + return USER_CLOSING; } int user_kill(User *u, int signo) { @@ -609,7 +616,8 @@ static const char* const user_state_table[_USER_STATE_MAX] = { [USER_OFFLINE] = "offline", [USER_LINGERING] = "lingering", [USER_ONLINE] = "online", - [USER_ACTIVE] = "active" + [USER_ACTIVE] = "active", + [USER_CLOSING] = "closing" }; DEFINE_STRING_TABLE_LOOKUP(user_state, UserState);