parse-argument: make parse_tristate_argument() do something useful

I expressed the issue I have with parse_tristate_argument()
in #37751: it doesn't add any value to direct use of parse_tristate();
on the contrary, it doesn't support means to reset the arg to "auto"/-1 state.
The mere reason it existed is that we need a int type ret param.

Since the previous attempt to address this mess failed, let's
try to make the function more useful by making it accept "auto".
I figure this is useful on its own.

As requested in
https://github.com/systemd/systemd/pull/40652#discussion_r2831833996,
the function name is suffixed with _with_auto() to establish
that "auto" is handled internally.
This commit is contained in:
Mike Yuan
2026-02-20 21:20:45 +01:00
parent 774e805959
commit 577e5e9a5e
9 changed files with 30 additions and 30 deletions
+13 -15
View File
@@ -20,10 +20,12 @@ int parse_boolean_argument(const char *optname, const char *s, bool *ret) {
/* Returns the result through *ret and the return value. */
assert(optname);
if (s) {
r = parse_boolean(s);
if (r < 0)
return log_error_errno(r, "Failed to parse boolean argument to %s: %s.", optname, s);
return log_error_errno(r, "Failed to parse boolean argument to '%s': %s", optname, s);
if (ret)
*ret = r;
@@ -36,24 +38,20 @@ int parse_boolean_argument(const char *optname, const char *s, bool *ret) {
}
}
int parse_tristate_argument(const char *optname, const char *s, int *ret) {
int parse_tristate_argument_with_auto(const char *optname, const char *s, int *ret) {
int r;
if (s) {
r = parse_boolean(s);
if (r < 0)
return log_error_errno(r, "Failed to parse boolean argument to %s: %s.", optname, s);
assert(optname);
assert(s); /* We refuse NULL optarg here, since that would be ambiguous on cmdline:
for --enable-a[=BOOL], --enable-a is intuitively interpreted as true rather than "auto"
(parse_boolean_argument() does exactly that). IOW, tristate options should require
arguments. */
if (ret)
*ret = r;
r = parse_tristate_full(s, "auto", ret);
if (r < 0)
return log_error_errno(r, "Failed to parse tristate argument to '%s': %s", optname, s);
return r;
} else {
if (ret)
*ret = -1;
return 0;
}
return 0;
}
int parse_json_argument(const char *s, sd_json_format_flags_t *ret) {