]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
logind: save/restore User object's "stopping" field during restarts
authorLennart Poettering <lennart@poettering.net>
Mon, 6 Aug 2018 16:14:11 +0000 (18:14 +0200)
committerLennart Poettering <lennart@poettering.net>
Sat, 13 Oct 2018 10:59:29 +0000 (12:59 +0200)
Whether we are stopping or not is highly relevant, hence don't forget it
across restarts.

src/login/logind-user.c
src/login/logind-user.h

index 302d3b08e681b14858c39cea54d996eb7384b167..416a2b3aaeef39fa7aa43df1ba79c2f0e776f79b 100644 (file)
@@ -136,9 +136,11 @@ static int user_save_internal(User *u) {
         fprintf(f,
                 "# This is private data. Do not parse.\n"
                 "NAME=%s\n"
-                "STATE=%s\n",
+                "STATE=%s\n"         /* friendly user-facing state */
+                "STOPPING=%s\n",     /* low-level state */
                 u->name,
-                user_state_to_string(user_get_state(u)));
+                user_state_to_string(user_get_state(u)),
+                yes_no(u->stopping));
 
         /* LEGACY: no-one reads RUNTIME= anymore, drop it at some point */
         if (u->runtime_path)
@@ -277,14 +279,14 @@ int user_save(User *u) {
 }
 
 int user_load(User *u) {
-        _cleanup_free_ char *realtime = NULL, *monotonic = NULL;
+        _cleanup_free_ char *realtime = NULL, *monotonic = NULL, *stopping = NULL;
         int r;
 
         assert(u);
 
         r = parse_env_file(NULL, u->state_file, NEWLINE,
                            "SERVICE_JOB", &u->service_job,
-                           "SLICE_JOB",   &u->slice_job,
+                           "STOPPING",    &stopping,
                            "REALTIME",    &realtime,
                            "MONOTONIC",   &monotonic,
                            NULL);
@@ -293,12 +295,20 @@ int user_load(User *u) {
         if (r < 0)
                 return log_error_errno(r, "Failed to read %s: %m", u->state_file);
 
+        if (stopping) {
+                r = parse_boolean(stopping);
+                if (r < 0)
+                        log_debug_errno(r, "Failed to parse 'STOPPING' boolean: %s", stopping);
+                else
+                        u->stopping = r;
+        }
+
         if (realtime)
                 timestamp_deserialize(realtime, &u->timestamp.realtime);
         if (monotonic)
                 timestamp_deserialize(monotonic, &u->timestamp.monotonic);
 
-        return r;
+        return 0;
 }
 
 static int user_start_service(User *u) {
index eba23252841149941992ce5cb9a2107d7471acf6..03e020b870011e3774b51907461dcf22df1801cf 100644 (file)
@@ -36,8 +36,9 @@ struct User {
         dual_timestamp timestamp;
 
         bool in_gc_queue:1;
-        bool started:1;
-        bool stopping:1;
+
+        bool started:1;       /* Whenever the user being started, has been started or is being stopped again. */
+        bool stopping:1;      /* Whenever the user is being stopped or has been stopped. */
 
         LIST_HEAD(Session, sessions);
         LIST_FIELDS(User, gc_queue);