summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2014-08-19 02:14:32 +0200
committerLennart Poettering <lennart@poettering.net>2014-08-19 02:14:32 +0200
commitdfc87cbfe5ec03190e5b2235b1ed477db11541ca (patch)
treeb8ce6a02ba4b1cf78276277bb2af0807b41170d3
parentd61bb44a89fde3042c7c15ea4975239f7dcb0cb0 (diff)
sysusers: optionally, read sysuers configuration from standard input
-rw-r--r--man/systemd-sysusers.xml5
-rw-r--r--src/sysusers/sysusers.c21
2 files changed, 18 insertions, 8 deletions
diff --git a/man/systemd-sysusers.xml b/man/systemd-sysusers.xml
index 4de1973dc6..68710603ad 100644
--- a/man/systemd-sysusers.xml
+++ b/man/systemd-sysusers.xml
@@ -75,7 +75,10 @@
basename of a file is specified, all directories as
specified in
<citerefentry><refentrytitle>sysusers.d</refentrytitle><manvolnum>5</manvolnum></citerefentry>
- are searched for a matching file.</para>
+ are searched for a matching file. If the string
+ <filename>-</filename> is specified as filenames
+ entries from the standard input of the process are
+ read.</para>
</refsect1>
<refsect1>
diff --git a/src/sysusers/sysusers.c b/src/sysusers/sysusers.c
index 7daea28073..f78fb4fff3 100644
--- a/src/sysusers/sysusers.c
+++ b/src/sysusers/sysusers.c
@@ -1573,20 +1573,27 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) {
}
static int read_config_file(const char *fn, bool ignore_enoent) {
- _cleanup_fclose_ FILE *f = NULL;
+ _cleanup_fclose_ FILE *rf = NULL;
+ FILE *f = NULL;
char line[LINE_MAX];
unsigned v = 0;
int r;
assert(fn);
- r = search_and_fopen_nulstr(fn, "re", arg_root, conf_file_dirs, &f);
- if (r < 0) {
- if (ignore_enoent && r == -ENOENT)
- return 0;
+ if (streq(fn, "-"))
+ f = stdin;
+ else {
+ r = search_and_fopen_nulstr(fn, "re", arg_root, conf_file_dirs, &rf);
+ if (r < 0) {
+ if (ignore_enoent && r == -ENOENT)
+ return 0;
- log_error("Failed to open '%s', ignoring: %s", fn, strerror(-r));
- return r;
+ log_error("Failed to open '%s', ignoring: %s", fn, strerror(-r));
+ return r;
+ }
+
+ f = rf;
}
FOREACH_LINE(line, f, break) {