summaryrefslogtreecommitdiff
path: root/src/shared
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2013-11-06 03:15:16 +0100
committerLennart Poettering <lennart@poettering.net>2013-11-06 03:15:16 +0100
commit74df0fca09b3c31ed19e14ba80f996fdff772417 (patch)
tree6910dfb512fa634c8e65a5c938f24d4dc133d716 /src/shared
parent1f0cd86b3dc0f938ce179cdddc62fc0f584e599d (diff)
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.
Diffstat (limited to 'src/shared')
-rw-r--r--src/shared/util.c36
-rw-r--r--src/shared/util.h4
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);