]> err.no Git - systemd/commitdiff
logind: add new user state 'closing'
authorLennart Poettering <lennart@poettering.net>
Thu, 31 May 2012 17:47:52 +0000 (19:47 +0200)
committerLennart Poettering <lennart@poettering.net>
Thu, 31 May 2012 17:47:52 +0000 (19:47 +0200)
src/login/logind-user.c
src/login/logind-user.h

index 8bd773086e11a6653a03122ee328c6b28b25517e..4622812e3c66eda4a2153e13f18f8af9864df5db 100644 (file)
@@ -523,9 +523,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 +547,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 +577,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 +618,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);
index 78249ac6478a1a728239a9f25c115c2667dbfdaf..93e5fd934a0ad40ae886c8780aeadac07b4bacc6 100644 (file)
@@ -34,6 +34,7 @@ typedef enum UserState {
         USER_LINGERING,
         USER_ONLINE,
         USER_ACTIVE,
+        USER_CLOSING,
         _USER_STATE_MAX,
         _USER_STATE_INVALID = -1
 } UserState;