X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=src%2Fsysusers%2Fsysusers.c;h=d0ab5a9b6ce686cc497166ebbdb9b46d0850f531;hb=ee228be10c45e05d5ef5c9ed6b43175d3bf8c17b;hp=ccb3fca8f2fb5f0ae519a98ed5184ad882c284d0;hpb=cb8770ed2137c509f2b73af33619fa0168d727e3;p=thirdparty%2Fsystemd.git diff --git a/src/sysusers/sysusers.c b/src/sysusers/sysusers.c index ccb3fca8f2f..d0ab5a9b6ce 100644 --- a/src/sysusers/sysusers.c +++ b/src/sysusers/sysusers.c @@ -1,9 +1,4 @@ /* SPDX-License-Identifier: LGPL-2.1+ */ -/*** - This file is part of systemd. - - Copyright 2014 Lennart Poettering -***/ #include #include @@ -13,18 +8,18 @@ #include "copy.h" #include "def.h" #include "fd-util.h" -#include "fileio-label.h" +#include "fileio.h" #include "format-util.h" #include "fs-util.h" #include "hashmap.h" #include "pager.h" #include "path-util.h" +#include "pretty-print.h" #include "selinux-util.h" #include "smack-util.h" #include "specifier.h" #include "string-util.h" #include "strv.h" -#include "terminal-util.h" #include "uid-range.h" #include "user-util.h" #include "utf8.h" @@ -67,7 +62,7 @@ static char *arg_root = NULL; static bool arg_cat_config = false; static const char *arg_replace = NULL; static bool arg_inline = false; -static bool arg_no_pager = false; +static PagerFlags arg_pager_flags = 0; static OrderedHashmap *users = NULL, *groups = NULL; static OrderedHashmap *todo_uids = NULL, *todo_gids = NULL; @@ -212,11 +207,9 @@ static int make_backup(const char *target, const char *x) { backup = strjoina(x, "-"); /* Copy over the access mask */ - if (fchmod(fileno(dst), st.st_mode & 07777) < 0) - log_warning_errno(errno, "Failed to change mode on %s: %m", backup); - - if (fchown(fileno(dst), st.st_uid, st.st_gid)< 0) - log_warning_errno(errno, "Failed to change ownership of %s: %m", backup); + r = fchmod_and_chown(fileno(dst), st.st_mode & 07777, st.st_uid, st.st_gid); + if (r < 0) + log_warning_errno(r, "Failed to change access mode or ownership of %s: %m", backup); ts[0] = st.st_atim; ts[1] = st.st_mtim; @@ -335,13 +328,7 @@ static int sync_rights(FILE *from, FILE *to) { if (fstat(fileno(from), &st) < 0) return -errno; - if (fchmod(fileno(to), st.st_mode & 07777) < 0) - return -errno; - - if (fchown(fileno(to), st.st_uid, st.st_gid) < 0) - return -errno; - - return 0; + return fchmod_and_chown(fileno(to), st.st_mode & 07777, st.st_uid, st.st_gid); } static int rename_and_apply_smack(const char *temp_path, const char *dest_path) { @@ -1125,10 +1112,10 @@ static int add_group(Item *i) { * r > 0: means the gid does not exist -> fail * r == 0: means the gid exists -> nothing more to do. */ - if (r > 0) { - log_error("Failed to create %s: please create GID %d", i->name, i->gid); - return -EINVAL; - } + if (r > 0) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), + "Failed to create %s: please create GID %d", + i->name, i->gid); if (r == 0) return 0; } @@ -1694,7 +1681,6 @@ 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 *rf = NULL; FILE *f = NULL; - char line[LINE_MAX]; unsigned v = 0; int r = 0; @@ -1714,10 +1700,17 @@ static int read_config_file(const char *fn, bool ignore_enoent) { f = rf; } - FOREACH_LINE(line, f, break) { + for (;;) { + _cleanup_free_ char *line = NULL; char *l; int k; + k = read_line(f, LONG_LINE_MAX, &line); + if (k < 0) + return log_error_errno(k, "Failed to read '%s': %m", fn); + if (k == 0) + break; + v++; l = strstrip(line); @@ -1767,12 +1760,19 @@ static int cat_config(void) { if (r < 0) return r; - (void) pager_open(arg_no_pager, false); + (void) pager_open(arg_pager_flags); return cat_files(NULL, files, 0); } -static void help(void) { +static int help(void) { + _cleanup_free_ char *link = NULL; + int r; + + r = terminal_urlify_man("systemd-sysusers.service", "8", &link); + if (r < 0) + return log_oom(); + printf("%s [OPTIONS...] [CONFIGURATION FILE...]\n\n" "Creates system user accounts.\n\n" " -h --help Show this help\n" @@ -1782,7 +1782,12 @@ static void help(void) { " --replace=PATH Treat arguments as replacement for PATH\n" " --inline Treat arguments as configuration lines\n" " --no-pager Do not pipe output into a pager\n" - , program_invocation_short_name); + "\nSee the %s for details.\n" + , program_invocation_short_name + , link + ); + + return 0; } static int parse_argv(int argc, char *argv[]) { @@ -1817,8 +1822,7 @@ static int parse_argv(int argc, char *argv[]) { switch (c) { case 'h': - help(); - return 0; + return help(); case ARG_VERSION: return version(); @@ -1835,10 +1839,9 @@ static int parse_argv(int argc, char *argv[]) { case ARG_REPLACE: if (!path_is_absolute(optarg) || - !endswith(optarg, ".conf")) { - log_error("The argument to --replace= must an absolute path to a config file"); - return -EINVAL; - } + !endswith(optarg, ".conf")) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), + "The argument to --replace= must an absolute path to a config file"); arg_replace = optarg; break; @@ -1848,7 +1851,7 @@ static int parse_argv(int argc, char *argv[]) { break; case ARG_NO_PAGER: - arg_no_pager = true; + arg_pager_flags |= PAGER_DISABLE; break; case '?': @@ -1858,15 +1861,13 @@ static int parse_argv(int argc, char *argv[]) { assert_not_reached("Unhandled option"); } - if (arg_replace && arg_cat_config) { - log_error("Option --replace= is not supported with --cat-config"); - return -EINVAL; - } + if (arg_replace && arg_cat_config) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), + "Option --replace= is not supported with --cat-config"); - if (arg_replace && optind >= argc) { - log_error("When --replace= is given, some configuration items must be specified"); - return -EINVAL; - } + if (arg_replace && optind >= argc) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), + "When --replace= is given, some configuration items must be specified"); return 1; } @@ -1921,17 +1922,15 @@ static int read_config_files(char **args) { int main(int argc, char *argv[]) { _cleanup_close_ int lock = -1; Iterator iterator; - int r; + char *n, **v; Item *i; - char *n; + int r; r = parse_argv(argc, argv); if (r <= 0) goto finish; - log_set_target(LOG_TARGET_AUTO); - log_parse_environment(); - log_open(); + log_setup_service(); if (arg_cat_config) { r = cat_config(); @@ -2016,8 +2015,8 @@ finish: ordered_hashmap_free_with_destructor(groups, item_free); ordered_hashmap_free_with_destructor(users, item_free); - while ((n = ordered_hashmap_first_key(members))) { - strv_free(ordered_hashmap_steal_first(members)); + while ((v = ordered_hashmap_steal_first_key_and_value(members, (void **) &n))) { + strv_free(v); free(n); } ordered_hashmap_free(members);