From 74df0fca09b3c31ed19e14ba80f996fdff772417 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 6 Nov 2013 03:15:16 +0100 Subject: util: unify reading of /proc/cmdline Instead of individually checking for containers in each user do this once in a new call proc_cmdline() that read the file only if we are not in a container. --- src/shared/util.c | 36 ++++++++++++++++++++++++------------ src/shared/util.h | 4 +++- 2 files changed, 27 insertions(+), 13 deletions(-) (limited to 'src/shared') 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); -- cgit v1.2.3-54-g00ecf