sysusers: allow defining additional sysusers lines via credentials
This commit is contained in:
committed by
Yu Watanabe
parent
69a7d10832
commit
3acb6edef3
+34
-13
@@ -1981,7 +1981,7 @@ static int parse_arguments(char **args) {
|
||||
/* Use (argument):n, where n==1 for the first positional arg */
|
||||
r = parse_line("(argument)", pos, *arg);
|
||||
else
|
||||
r = read_config_file(*arg, false);
|
||||
r = read_config_file(*arg, /* ignore_enoent= */ false);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
@@ -2011,12 +2011,31 @@ static int read_config_files(char **args) {
|
||||
log_debug("Reading config file \"%s\"%s", *f, special_glyph(SPECIAL_GLYPH_ELLIPSIS));
|
||||
|
||||
/* Just warn, ignore result otherwise */
|
||||
(void) read_config_file(*f, true);
|
||||
(void) read_config_file(*f, /* ignore_enoent= */ true);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int read_credential_lines(void) {
|
||||
_cleanup_free_ char *j = NULL;
|
||||
const char *d;
|
||||
int r;
|
||||
|
||||
r = get_credentials_dir(&d);
|
||||
if (r == -ENXIO)
|
||||
return 0;
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to get credentials directory: %m");
|
||||
|
||||
j = path_join(d, "sysusers.extra");
|
||||
if (!j)
|
||||
return log_oom();
|
||||
|
||||
(void) read_config_file(j, /* ignore_enoent= */ true);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int run(int argc, char *argv[]) {
|
||||
#ifndef STANDALONE
|
||||
_cleanup_(loop_device_unrefp) LoopDevice *loop_device = NULL;
|
||||
@@ -2068,12 +2087,10 @@ static int run(int argc, char *argv[]) {
|
||||
assert(!arg_image);
|
||||
#endif
|
||||
|
||||
/* If command line arguments are specified along with --replace, read all
|
||||
* configuration files and insert the positional arguments at the specified
|
||||
* place. Otherwise, if command line arguments are specified, execute just
|
||||
* them, and finally, without --replace= or any positional arguments, just
|
||||
* read configuration and execute it.
|
||||
*/
|
||||
/* If command line arguments are specified along with --replace, read all configuration files and
|
||||
* insert the positional arguments at the specified place. Otherwise, if command line arguments are
|
||||
* specified, execute just them, and finally, without --replace= or any positional arguments, just
|
||||
* read configuration and execute it. */
|
||||
if (arg_replace || optind >= argc)
|
||||
r = read_config_files(argv + optind);
|
||||
else
|
||||
@@ -2081,11 +2098,15 @@ static int run(int argc, char *argv[]) {
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
/* Let's tell nss-systemd not to synthesize the "root" and "nobody" entries for it, so that our detection
|
||||
* whether the names or UID/GID area already used otherwise doesn't get confused. After all, even though
|
||||
* nss-systemd synthesizes these users/groups, they should still appear in /etc/passwd and /etc/group, as the
|
||||
* synthesizing logic is merely supposed to be fallback for cases where we run with a completely unpopulated
|
||||
* /etc. */
|
||||
r = read_credential_lines();
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
/* Let's tell nss-systemd not to synthesize the "root" and "nobody" entries for it, so that our
|
||||
* detection whether the names or UID/GID area already used otherwise doesn't get confused. After
|
||||
* all, even though nss-systemd synthesizes these users/groups, they should still appear in
|
||||
* /etc/passwd and /etc/group, as the synthesizing logic is merely supposed to be fallback for cases
|
||||
* where we run with a completely unpopulated /etc. */
|
||||
if (setenv("SYSTEMD_NSS_BYPASS_SYNTHETIC", "1", 1) < 0)
|
||||
return log_error_errno(errno, "Failed to set SYSTEMD_NSS_BYPASS_SYNTHETIC environment variable: %m");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user