From 9de12b2ef4ccd95e7e1a4f37d507c50100dda637 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 26 Oct 2018 12:00:01 +0200 Subject: [PATCH 1/3] proc-cmdline: use our usual syntax for denoting bit mask enums --- src/basic/proc-cmdline.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/basic/proc-cmdline.h b/src/basic/proc-cmdline.h index bb8b18d3b1..efa88df0a0 100644 --- a/src/basic/proc-cmdline.h +++ b/src/basic/proc-cmdline.h @@ -6,9 +6,9 @@ #include "log.h" enum { - PROC_CMDLINE_STRIP_RD_PREFIX = 1, - PROC_CMDLINE_VALUE_OPTIONAL = 2, - PROC_CMDLINE_RD_STRICT = 4 + PROC_CMDLINE_STRIP_RD_PREFIX = 1 << 0, + PROC_CMDLINE_VALUE_OPTIONAL = 1 << 1, + PROC_CMDLINE_RD_STRICT = 1 << 2, }; typedef int (*proc_cmdline_parse_t)(const char *key, const char *value, void *data); From cb447ff5cc99e8c122a88fa78d7b80e4c572529b Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 26 Oct 2018 12:00:37 +0200 Subject: [PATCH 2/3] proc-cmdline: use FLAGS_SET() where appropriate This was mostly prompted by seeing the expression "in_initrd() && flags & PROC_CMDLINE_RD_STRICT", which uses & and && without any brackets. Let's make that a bit more readable and hide all doubts about operator precedence. --- src/basic/proc-cmdline.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/basic/proc-cmdline.c b/src/basic/proc-cmdline.c index 647c61ce73..b8839ef52c 100644 --- a/src/basic/proc-cmdline.c +++ b/src/basic/proc-cmdline.c @@ -64,10 +64,11 @@ int proc_cmdline_parse_given(const char *line, proc_cmdline_parse_t parse_item, if (!in_initrd()) continue; - if (flags & PROC_CMDLINE_STRIP_RD_PREFIX) + if (FLAGS_SET(flags, PROC_CMDLINE_STRIP_RD_PREFIX)) key = q; - } else if (in_initrd() && flags & PROC_CMDLINE_RD_STRICT) - continue; + + } else if (FLAGS_SET(flags, PROC_CMDLINE_RD_STRICT) && in_initrd()) + continue; /* And optionally filter out arguments that are intended only for the host */ value = strchr(key, '='); if (value) @@ -148,7 +149,7 @@ int proc_cmdline_get_key(const char *key, unsigned flags, char **value) { if (isempty(key)) return -EINVAL; - if ((flags & PROC_CMDLINE_VALUE_OPTIONAL) && !value) + if (FLAGS_SET(flags, PROC_CMDLINE_VALUE_OPTIONAL) && !value) return -EINVAL; r = proc_cmdline(&line); @@ -183,7 +184,7 @@ int proc_cmdline_get_key(const char *key, unsigned flags, char **value) { found = true; - } else if (*e == 0 && (flags & PROC_CMDLINE_VALUE_OPTIONAL)) + } else if (*e == 0 && FLAGS_SET(flags, PROC_CMDLINE_VALUE_OPTIONAL)) found = true; } else { From 7d95229ba7b4e5e862794647c367bcdc8237c8b6 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 26 Oct 2018 12:02:55 +0200 Subject: [PATCH 3/3] proc-cmdline: teach proc_cmdline_get_key() the same flags magic as proc_cmdline_parse() --- src/basic/proc-cmdline.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/basic/proc-cmdline.c b/src/basic/proc-cmdline.c index b8839ef52c..205ea08f6d 100644 --- a/src/basic/proc-cmdline.c +++ b/src/basic/proc-cmdline.c @@ -159,7 +159,7 @@ int proc_cmdline_get_key(const char *key, unsigned flags, char **value) { p = line; for (;;) { _cleanup_free_ char *word = NULL; - const char *e; + const char *e, *k, *q; r = extract_first_word(&p, &word, NULL, EXTRACT_QUOTES|EXTRACT_RELAX); if (r < 0) @@ -167,13 +167,23 @@ int proc_cmdline_get_key(const char *key, unsigned flags, char **value) { if (r == 0) break; + k = word; + /* Automatically filter out arguments that are intended only for the initrd, if we are not in the * initrd. */ - if (!in_initrd() && startswith(word, "rd.")) + q = startswith(word, "rd."); + if (q) { + if (!in_initrd()) + continue; + + if (FLAGS_SET(flags, PROC_CMDLINE_STRIP_RD_PREFIX)) + k = q; + + } else if (FLAGS_SET(flags, PROC_CMDLINE_RD_STRICT) && in_initrd()) continue; if (value) { - e = proc_cmdline_key_startswith(word, key); + e = proc_cmdline_key_startswith(k, key); if (!e) continue; @@ -188,7 +198,7 @@ int proc_cmdline_get_key(const char *key, unsigned flags, char **value) { found = true; } else { - if (streq(word, key)) + if (streq(k, key)) found = true; } }