sysusers: take configuration as positional arguments

If the configuration is included in a script, this is more convient.
I thought it would be possible to use this for rpm scriptlets with
'%pre -p systemd-sysuser "..."', but apparently there is no way to pass
arguments to the executable ($1 is used for the package installation count).
But this functionality seems generally useful, e.g. for testing and one-off
scripts, so let's keep it.

There's a slight change in behaviour when files are given on the command line:
if we cannot parse them, error out instead of ignoring the failure. When trying
to parse all configuration files, we don't want to fail even if some config
files are broken, but when parsing a list of items specified explicitly, we
should.

v2:
- rename --direct to --inline
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2018-01-29 14:47:01 +01:00
parent d1e4b8fd96
commit 1b600bd522
2 changed files with 21 additions and 3 deletions

View File

@ -94,6 +94,12 @@
paths. </para></listitem>
</varlistentry>
<varlistentry>
<term><option>--inline</option></term>
<listitem><para>Treat each positional argument as a separate configuration
line instead of a file name.</para></listitem>
</varlistentry>
<xi:include href="standard-options.xml" xpointer="help" />
<xi:include href="standard-options.xml" xpointer="version" />
</variablelist>

View File

@ -74,6 +74,7 @@ typedef struct Item {
} Item;
static char *arg_root = NULL;
static bool arg_inline = false;
static const char conf_file_dirs[] = CONF_PATHS_NULSTR("sysusers.d");
@ -1718,6 +1719,7 @@ static void help(void) {
" -h --help Show this help\n"
" --version Show package version\n"
" --root=PATH Operate on an alternate filesystem root\n"
" --inline Treat arguments as configuration lines\n"
, program_invocation_short_name);
}
@ -1726,12 +1728,14 @@ static int parse_argv(int argc, char *argv[]) {
enum {
ARG_VERSION = 0x100,
ARG_ROOT,
ARG_INLINE,
};
static const struct option options[] = {
{ "help", no_argument, NULL, 'h' },
{ "version", no_argument, NULL, ARG_VERSION },
{ "root", required_argument, NULL, ARG_ROOT },
{ "inline", no_argument, NULL, ARG_INLINE },
{}
};
@ -1757,6 +1761,10 @@ static int parse_argv(int argc, char *argv[]) {
return r;
break;
case ARG_INLINE:
arg_inline = true;
break;
case '?':
return -EINVAL;
@ -1795,9 +1803,13 @@ int main(int argc, char *argv[]) {
int j;
for (j = optind; j < argc; j++) {
k = read_config_file(argv[j], false);
if (k < 0 && r == 0)
r = k;
if (arg_inline)
/* Use (argument):n, where n==1 for the first positional arg */
r = parse_line("(argument)", j - optind + 1, argv[j]);
else
r = read_config_file(argv[j], false);
if (r < 0)
goto finish;
}
} else {
_cleanup_strv_free_ char **files = NULL;