X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=src%2Fsysusers%2Fsysusers.c;h=d0ab5a9b6ce686cc497166ebbdb9b46d0850f531;hb=ee228be10c45e05d5ef5c9ed6b43175d3bf8c17b;hp=33959d3c1117330d11c3a0b3946f848e4b9113ae;hpb=b0450864f1723ad12176d7956377d89ff4a84d8c;p=thirdparty%2Fsystemd.git diff --git a/src/sysusers/sysusers.c b/src/sysusers/sysusers.c index 33959d3c111..d0ab5a9b6ce 100644 --- a/src/sysusers/sysusers.c +++ b/src/sysusers/sysusers.c @@ -8,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" @@ -62,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; @@ -1112,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; } @@ -1681,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; @@ -1701,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); @@ -1754,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" @@ -1769,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[]) { @@ -1804,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(); @@ -1822,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; @@ -1835,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 '?': @@ -1845,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; } @@ -1908,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(); @@ -2003,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);