logind: save/restore User object's "stopping" field during restarts
Whether we are stopping or not is highly relevant, hence don't forget it across restarts.
This commit is contained in:
parent
0b6d55cae9
commit
d865bc024b
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue