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.
This commit is contained in:
+25
-13
@@ -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 = 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 */
|
||||
}
|
||||
r = proc_cmdline(&line);
|
||||
if (r < 0)
|
||||
return r;
|
||||
if (r == 0) /* Container ... */
|
||||
return 1;
|
||||
|
||||
FOREACH_WORD_QUOTED(w, l, line, state)
|
||||
if (strneq(w, "systemd.restore_state=0", l))
|
||||
return false;
|
||||
if (l == 23 && memcmp(w, "systemd.restore_state=0", 23))
|
||||
return 0;
|
||||
|
||||
return true;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int proc_cmdline(char **ret) {
|
||||
int r;
|
||||
|
||||
if (detect_container(NULL) > 0) {
|
||||
*ret = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
r = read_one_line_file("/proc/cmdline", ret);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
+3
-1
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user