diff options
Diffstat (limited to 'src/shared')
-rw-r--r-- | src/shared/util.c | 36 | ||||
-rw-r--r-- | src/shared/util.h | 4 |
2 files changed, 27 insertions, 13 deletions
diff --git a/src/shared/util.c b/src/shared/util.c index ef3b67b597..d753781c7a 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -5992,24 +5992,36 @@ int split_pair(const char *s, const char *sep, char **l, char **r) { return 0; } -bool restore_state(void) { +int shall_restore_state(void) { _cleanup_free_ char *line; char *w, *state; - int r; size_t l; + int r; - if (detect_container(NULL) > 0) - return true; + r = proc_cmdline(&line); + if (r < 0) + return r; + if (r == 0) /* Container ... */ + return 1; - r = read_one_line_file("/proc/cmdline", &line); - if (r < 0) { - log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r)); - return true; /* something is very wrong, let's not make it worse */ + FOREACH_WORD_QUOTED(w, l, line, state) + if (l == 23 && memcmp(w, "systemd.restore_state=0", 23)) + return 0; + + return 1; +} + +int proc_cmdline(char **ret) { + int r; + + if (detect_container(NULL) > 0) { + *ret = NULL; + return 0; } - FOREACH_WORD_QUOTED(w, l, line, state) - if (strneq(w, "systemd.restore_state=0", l)) - return false; + r = read_one_line_file("/proc/cmdline", ret); + if (r < 0) + return r; - return true; + return 1; } diff --git a/src/shared/util.h b/src/shared/util.h index d90b808476..8b4c15512a 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -770,7 +770,7 @@ void parse_user_at_host(char *arg, char **user, char **host); int split_pair(const char *s, const char *sep, char **l, char **r); -bool restore_state(void); +int shall_restore_state(void); /** * Normal qsort requires base to be nonnull. Here were require @@ -783,3 +783,5 @@ static inline void qsort_safe(void *base, size_t nmemb, size_t size, qsort(base, nmemb, size, compar); } } + +int proc_cmdline(char **ret); |