mirror of
https://github.com/Dasharo/systemd.git
synced 2026-03-06 15:02:31 -08:00
124 lines
3.7 KiB
C
124 lines
3.7 KiB
C
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
|
|
#include "format-table.h"
|
|
#include "parse-argument.h"
|
|
#include "path-util.h"
|
|
#include "signal-util.h"
|
|
#include "stdio-util.h"
|
|
#include "string-table.h"
|
|
#include "string-util.h"
|
|
|
|
/* All functions in this file emit warnings. */
|
|
|
|
int parse_boolean_argument(const char *optname, const char *s, bool *ret) {
|
|
int r;
|
|
|
|
/* Returns the result through *ret and the return value. */
|
|
|
|
if (s) {
|
|
r = parse_boolean(s);
|
|
if (r < 0)
|
|
return log_error_errno(r, "Failed to parse boolean argument to %s: %s.", optname, s);
|
|
|
|
if (ret)
|
|
*ret = r;
|
|
return r;
|
|
} else {
|
|
/* s may be NULL. This is controlled by getopt_long() parameters. */
|
|
if (ret)
|
|
*ret = true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
int parse_json_argument(const char *s, JsonFormatFlags *ret) {
|
|
assert(s);
|
|
assert(ret);
|
|
|
|
if (streq(s, "pretty"))
|
|
*ret = JSON_FORMAT_PRETTY|JSON_FORMAT_COLOR_AUTO;
|
|
else if (streq(s, "short"))
|
|
*ret = JSON_FORMAT_NEWLINE;
|
|
else if (streq(s, "off"))
|
|
*ret = JSON_FORMAT_OFF;
|
|
else if (streq(s, "help")) {
|
|
puts("pretty\n"
|
|
"short\n"
|
|
"off");
|
|
return 0; /* 0 means → we showed a brief help, exit now */
|
|
} else
|
|
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Unknown argument to --json= switch: %s", s);
|
|
|
|
return 1; /* 1 means → properly parsed */
|
|
}
|
|
|
|
int parse_path_argument(const char *path, bool suppress_root, char **arg) {
|
|
char *p;
|
|
int r;
|
|
|
|
/*
|
|
* This function is intended to be used in command line parsers, to handle paths that are passed
|
|
* in. It makes the path absolute, and reduces it to NULL if omitted or root (the latter optionally).
|
|
*
|
|
* NOTE THAT THIS WILL FREE THE PREVIOUS ARGUMENT POINTER ON SUCCESS!
|
|
* Hence, do not pass in uninitialized pointers.
|
|
*/
|
|
|
|
if (isempty(path)) {
|
|
*arg = mfree(*arg);
|
|
return 0;
|
|
}
|
|
|
|
r = path_make_absolute_cwd(path, &p);
|
|
if (r < 0)
|
|
return log_error_errno(r, "Failed to parse path \"%s\" and make it absolute: %m", path);
|
|
|
|
path_simplify(p);
|
|
if (suppress_root && empty_or_root(p))
|
|
p = mfree(p);
|
|
|
|
return free_and_replace(*arg, p);
|
|
}
|
|
|
|
int parse_signal_argument(const char *s, int *ret) {
|
|
int r;
|
|
|
|
assert(s);
|
|
assert(ret);
|
|
|
|
if (streq(s, "help")) {
|
|
DUMP_STRING_TABLE(signal, int, _NSIG);
|
|
return 0;
|
|
}
|
|
|
|
if (streq(s, "list")) {
|
|
_cleanup_(table_unrefp) Table *table = NULL;
|
|
|
|
table = table_new("signal", "name");
|
|
if (!table)
|
|
return log_oom();
|
|
|
|
for (int i = 1; i < _NSIG; i++) {
|
|
r = table_add_many(
|
|
table,
|
|
TABLE_INT, i,
|
|
TABLE_SIGNAL, i);
|
|
if (r < 0)
|
|
return table_log_add_error(r);
|
|
}
|
|
|
|
r = table_print(table, NULL);
|
|
if (r < 0)
|
|
return table_log_print_error(r);
|
|
|
|
return 0;
|
|
}
|
|
|
|
r = signal_from_string(s);
|
|
if (r < 0)
|
|
return log_error_errno(r, "Failed to parse signal string \"%s\".", s);
|
|
|
|
*ret = r;
|
|
return 1; /* work to do */
|
|
}
|