From aba311f7ffb1370156f48061a5fdc2da9551e57f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Tue, 4 Dec 2018 10:56:44 +0100 Subject: [PATCH 1/6] generators: configure logging before the first use --- src/cryptsetup/cryptsetup-generator.c | 4 ++-- src/debug-generator/debug-generator.c | 4 ++-- src/fstab-generator/fstab-generator.c | 4 ++-- src/getty-generator/getty-generator.c | 4 ++-- src/gpt-auto-generator/gpt-auto-generator.c | 4 ++-- src/system-update-generator/system-update-generator.c | 4 ++-- src/veritysetup/veritysetup-generator.c | 4 ++-- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/cryptsetup/cryptsetup-generator.c b/src/cryptsetup/cryptsetup-generator.c index 8a889e980a..746505a181 100644 --- a/src/cryptsetup/cryptsetup-generator.c +++ b/src/cryptsetup/cryptsetup-generator.c @@ -583,14 +583,14 @@ DEFINE_PRIVATE_HASH_OPS_WITH_VALUE_DESTRUCTOR(crypt_device_hash_ops, char, strin static int run(int argc, char *argv[]) { int r; + log_setup_generator(); + if (argc > 1 && argc != 4) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program takes three or no arguments."); if (argc > 1) arg_dest = argv[1]; - log_setup_generator(); - arg_disks = hashmap_new(&crypt_device_hash_ops); if (!arg_disks) return log_oom(); diff --git a/src/debug-generator/debug-generator.c b/src/debug-generator/debug-generator.c index 24bc4bd7e2..2615aa189d 100644 --- a/src/debug-generator/debug-generator.c +++ b/src/debug-generator/debug-generator.c @@ -145,6 +145,8 @@ static int generate_wants_symlinks(void) { static int run(int argc, char *argv[]) { int r, q; + log_setup_generator(); + if (argc > 1 && argc != 4) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program takes three or no arguments."); @@ -152,8 +154,6 @@ static int run(int argc, char *argv[]) { if (argc > 1) arg_dest = argv[2]; - log_setup_generator(); - r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, PROC_CMDLINE_RD_STRICT | PROC_CMDLINE_STRIP_RD_PREFIX); if (r < 0) log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m"); diff --git a/src/fstab-generator/fstab-generator.c b/src/fstab-generator/fstab-generator.c index 85cc36d80d..8acee53d6c 100644 --- a/src/fstab-generator/fstab-generator.c +++ b/src/fstab-generator/fstab-generator.c @@ -871,6 +871,8 @@ static int determine_root(void) { static int run(int argc, char *argv[]) { int r; + log_setup_generator(); + if (argc > 1 && argc != 4) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program takes three or no arguments."); @@ -880,8 +882,6 @@ static int run(int argc, char *argv[]) { if (argc > 3) arg_dest_late = argv[3]; - log_setup_generator(); - r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, 0); if (r < 0) log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m"); diff --git a/src/getty-generator/getty-generator.c b/src/getty-generator/getty-generator.c index e2e07bca76..e604ff79a1 100644 --- a/src/getty-generator/getty-generator.c +++ b/src/getty-generator/getty-generator.c @@ -113,6 +113,8 @@ int main(int argc, char *argv[]) { const char *j; int r; + log_setup_generator(); + if (argc > 1 && argc != 4) { log_error("This program takes three or no arguments."); return EXIT_FAILURE; @@ -121,8 +123,6 @@ int main(int argc, char *argv[]) { if (argc > 1) arg_dest = argv[1]; - log_setup_generator(); - if (detect_container() > 0) { _cleanup_free_ char *container_ttys = NULL; diff --git a/src/gpt-auto-generator/gpt-auto-generator.c b/src/gpt-auto-generator/gpt-auto-generator.c index d188927398..80e7bb671f 100644 --- a/src/gpt-auto-generator/gpt-auto-generator.c +++ b/src/gpt-auto-generator/gpt-auto-generator.c @@ -671,6 +671,8 @@ static int add_mounts(void) { int main(int argc, char *argv[]) { int r, k; + log_setup_generator(); + if (argc > 1 && argc != 4) { log_error("This program takes three or no arguments."); return EXIT_FAILURE; @@ -679,8 +681,6 @@ int main(int argc, char *argv[]) { if (argc > 1) arg_dest = argv[3]; - log_setup_generator(); - if (detect_container() > 0) { log_debug("In a container, exiting."); return EXIT_SUCCESS; diff --git a/src/system-update-generator/system-update-generator.c b/src/system-update-generator/system-update-generator.c index 06062e4510..80f53cf34c 100644 --- a/src/system-update-generator/system-update-generator.c +++ b/src/system-update-generator/system-update-generator.c @@ -54,6 +54,8 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat int main(int argc, char *argv[]) { int r, k; + log_setup_generator(); + if (argc > 1 && argc != 4) { log_error("This program takes three or no arguments."); return EXIT_FAILURE; @@ -62,8 +64,6 @@ int main(int argc, char *argv[]) { if (argc > 1) arg_dest = argv[2]; - log_setup_generator(); - r = generate_symlink(); if (r > 0) { diff --git a/src/veritysetup/veritysetup-generator.c b/src/veritysetup/veritysetup-generator.c index 0f5830a6e2..51996ec37e 100644 --- a/src/veritysetup/veritysetup-generator.c +++ b/src/veritysetup/veritysetup-generator.c @@ -207,14 +207,14 @@ static int determine_devices(void) { static int run(int argc, char *argv[]) { int r; + log_setup_generator(); + if (argc > 1 && argc != 4) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program takes three or no arguments."); if (argc > 1) arg_dest = argv[1]; - log_setup_generator(); - r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, PROC_CMDLINE_STRIP_RD_PREFIX); if (r < 0) return log_warning_errno(r, "Failed to parse kernel command line: %m"); From 7a44c7e31fdeebce82189b134221297919104e7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Tue, 4 Dec 2018 11:49:42 +0100 Subject: [PATCH 2/6] generators: define custom main func definer and use it where applicable There should be no functional difference, except that the error message is changd from "three or no arguments" to "zero or three arguments". Somehow the inverted form always seemed strange. umask() call is also dropped from run-generator. I think it wasn't dropped in 053254e3cb215df3b8c905bc39b920f8817e1c7d because the run generator was merged around the same time. --- src/cryptsetup/cryptsetup-generator.c | 15 ++++----------- src/debug-generator/debug-generator.c | 16 ++++------------ src/fstab-generator/fstab-generator.c | 20 ++++++-------------- src/rc-local-generator/rc-local-generator.c | 15 ++++----------- src/run-generator/run-generator.c | 19 ++++--------------- src/shared/generator.h | 16 ++++++++++++++++ src/shared/main-func.h | 9 +++++---- src/sysv-generator/sysv-generator.c | 16 ++++------------ src/veritysetup/veritysetup-generator.c | 18 ++++-------------- 9 files changed, 51 insertions(+), 93 deletions(-) diff --git a/src/cryptsetup/cryptsetup-generator.c b/src/cryptsetup/cryptsetup-generator.c index 746505a181..8759a26148 100644 --- a/src/cryptsetup/cryptsetup-generator.c +++ b/src/cryptsetup/cryptsetup-generator.c @@ -13,7 +13,6 @@ #include "hashmap.h" #include "id128-util.h" #include "log.h" -#include "main-func.h" #include "mkdir.h" #include "parse-util.h" #include "path-util.h" @@ -33,7 +32,7 @@ typedef struct crypto_device { bool create; } crypto_device; -static const char *arg_dest = "/tmp"; +static const char *arg_dest = NULL; static bool arg_enabled = true; static bool arg_read_crypttab = true; static bool arg_whitelist = false; @@ -580,16 +579,10 @@ static int add_proc_cmdline_devices(void) { DEFINE_PRIVATE_HASH_OPS_WITH_VALUE_DESTRUCTOR(crypt_device_hash_ops, char, string_hash_func, string_compare_func, crypto_device, crypt_device_free); -static int run(int argc, char *argv[]) { +static int run(const char *dest, const char *dest_early, const char *dest_late) { int r; - log_setup_generator(); - - if (argc > 1 && argc != 4) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program takes three or no arguments."); - - if (argc > 1) - arg_dest = argv[1]; + assert_se(arg_dest = dest); arg_disks = hashmap_new(&crypt_device_hash_ops); if (!arg_disks) @@ -613,4 +606,4 @@ static int run(int argc, char *argv[]) { return 0; } -DEFINE_MAIN_FUNCTION(run); +DEFINE_MAIN_GENERATOR_FUNCTION(run); diff --git a/src/debug-generator/debug-generator.c b/src/debug-generator/debug-generator.c index 2615aa189d..fa4ca57bbf 100644 --- a/src/debug-generator/debug-generator.c +++ b/src/debug-generator/debug-generator.c @@ -2,7 +2,6 @@ #include "alloc-util.h" #include "generator.h" -#include "main-func.h" #include "mkdir.h" #include "parse-util.h" #include "proc-cmdline.h" @@ -12,8 +11,8 @@ #include "unit-name.h" #include "util.h" +static const char *arg_dest = NULL; static char *arg_default_unit = NULL; -static const char *arg_dest = "/tmp"; static char **arg_mask = NULL; static char **arg_wants = NULL; static bool arg_debug_shell = false; @@ -142,17 +141,10 @@ static int generate_wants_symlinks(void) { return r; } -static int run(int argc, char *argv[]) { +static int run(const char *dest, const char *dest_early, const char *dest_late) { int r, q; - log_setup_generator(); - - if (argc > 1 && argc != 4) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "This program takes three or no arguments."); - - if (argc > 1) - arg_dest = argv[2]; + assert_se(arg_dest = dest_early); r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, PROC_CMDLINE_RD_STRICT | PROC_CMDLINE_STRIP_RD_PREFIX); if (r < 0) @@ -170,4 +162,4 @@ static int run(int argc, char *argv[]) { return r < 0 ? r : q; } -DEFINE_MAIN_FUNCTION(run); +DEFINE_MAIN_GENERATOR_FUNCTION(run); diff --git a/src/fstab-generator/fstab-generator.c b/src/fstab-generator/fstab-generator.c index 8acee53d6c..d5e5412059 100644 --- a/src/fstab-generator/fstab-generator.c +++ b/src/fstab-generator/fstab-generator.c @@ -40,8 +40,8 @@ typedef enum MountpointFlags { GROWFS = 1 << 4, } MountpointFlags; -static const char *arg_dest = "/tmp"; -static const char *arg_dest_late = "/tmp"; +static const char *arg_dest = NULL; +static const char *arg_dest_late = NULL; static bool arg_fstab_enabled = true; static char *arg_root_what = NULL; static char *arg_root_fstype = NULL; @@ -868,19 +868,11 @@ static int determine_root(void) { return 1; } -static int run(int argc, char *argv[]) { +static int run(const char *dest, const char *dest_early, const char *dest_late) { int r; - log_setup_generator(); - - if (argc > 1 && argc != 4) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "This program takes three or no arguments."); - - if (argc > 1) - arg_dest = argv[1]; - if (argc > 3) - arg_dest_late = argv[3]; + assert_se(arg_dest = dest); + assert_se(arg_dest_late = dest_late); r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, 0); if (r < 0) @@ -928,4 +920,4 @@ static int run(int argc, char *argv[]) { return r; } -DEFINE_MAIN_FUNCTION(run); +DEFINE_MAIN_GENERATOR_FUNCTION(run); diff --git a/src/rc-local-generator/rc-local-generator.c b/src/rc-local-generator/rc-local-generator.c index cd5510bf12..7a3948e92d 100644 --- a/src/rc-local-generator/rc-local-generator.c +++ b/src/rc-local-generator/rc-local-generator.c @@ -6,12 +6,11 @@ #include "generator.h" #include "log.h" -#include "main-func.h" #include "mkdir.h" #include "string-util.h" #include "util.h" -static const char *arg_dest = "/tmp"; +static const char *arg_dest = NULL; /* So you are reading this, and might wonder: why is this implemented as a generator rather than as a plain, statically * enabled service that carries appropriate ConditionFileIsExecutable= lines? The answer is this: conditions bypass @@ -55,16 +54,10 @@ static int check_executable(const char *path) { return 0; } -static int run(int argc, char *argv[]) { +static int run(const char *dest, const char *dest_early, const char *dest_late) { int r = 0, k = 0; - log_setup_generator(); - - if (argc > 1 && argc != 4) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program takes three or no arguments."); - - if (argc > 1) - arg_dest = argv[1]; + assert_se(arg_dest = dest); if (check_executable(RC_LOCAL_SCRIPT_PATH_START) >= 0) { log_debug("Automatically adding rc-local.service."); @@ -81,4 +74,4 @@ static int run(int argc, char *argv[]) { return r < 0 ? r : k; } -DEFINE_MAIN_FUNCTION(run); +DEFINE_MAIN_GENERATOR_FUNCTION(run); diff --git a/src/run-generator/run-generator.c b/src/run-generator/run-generator.c index 243a426cda..a5dfac01d4 100644 --- a/src/run-generator/run-generator.c +++ b/src/run-generator/run-generator.c @@ -5,13 +5,12 @@ #include "fd-util.h" #include "fileio.h" #include "generator.h" -#include "main-func.h" #include "mkdir.h" #include "proc-cmdline.h" #include "specifier.h" #include "strv.h" -static const char *arg_dest = "/tmp"; +static const char *arg_dest = NULL; static char **arg_commands = NULL; static char *arg_success_action = NULL; static char *arg_failure_action = NULL; @@ -122,20 +121,10 @@ static int generate(void) { return 0; } -static int run(int argc, char *argv[]) { +static int run(const char *dest, const char *dest_early, const char *dest_late) { int r; - log_setup_generator(); - - if (argc > 1 && argc != 4) { - log_error("This program takes three or no arguments."); - return -EINVAL; - } - - if (argc > 1) - arg_dest = argv[1]; - - umask(0022); + assert_se(arg_dest = dest); r = proc_cmdline_parse(parse, NULL, PROC_CMDLINE_RD_STRICT|PROC_CMDLINE_STRIP_RD_PREFIX); if (r < 0) @@ -144,4 +133,4 @@ static int run(int argc, char *argv[]) { return generate(); } -DEFINE_MAIN_FUNCTION(run); +DEFINE_MAIN_GENERATOR_FUNCTION(run); diff --git a/src/shared/generator.h b/src/shared/generator.h index f1a055401a..5a1c1e32f7 100644 --- a/src/shared/generator.h +++ b/src/shared/generator.h @@ -3,6 +3,8 @@ #include +#include "main-func.h" + int generator_open_unit_file( const char *dest, const char *source, @@ -49,3 +51,17 @@ int generator_hook_up_growfs( const char *target); void log_setup_generator(void); + +/* Similar to DEFINE_MAIN_FUNCTION, but initializes logging and assigns positional arguments. */ +#define DEFINE_MAIN_GENERATOR_FUNCTION(impl) \ + _DEFINE_MAIN_FUNCTION( \ + ({ \ + log_setup_generator(); \ + if (argc > 1 && argc != 4) \ + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), \ + "This program takes zero or three arguments."); \ + }), \ + impl(argc > 1 ? argv[1] : "/tmp", \ + argc > 1 ? argv[2] : "/tmp", \ + argc > 1 ? argv[3] : "/tmp"), \ + r < 0 ? EXIT_FAILURE : EXIT_SUCCESS) diff --git a/src/shared/main-func.h b/src/shared/main-func.h index ab6b272117..3c182e802b 100644 --- a/src/shared/main-func.h +++ b/src/shared/main-func.h @@ -9,10 +9,11 @@ #include "spawn-polkit-agent.h" #include "static-destruct.h" -#define _DEFINE_MAIN_FUNCTION(impl, ret) \ +#define _DEFINE_MAIN_FUNCTION(intro, impl, ret) \ int main(int argc, char *argv[]) { \ int r; \ - r = impl(argc, argv); \ + intro; \ + r = impl; \ static_destruct(); \ ask_password_agent_close(); \ polkit_agent_close(); \ @@ -24,10 +25,10 @@ /* Negative return values from impl are mapped to EXIT_FAILURE, and * everything else means success! */ #define DEFINE_MAIN_FUNCTION(impl) \ - _DEFINE_MAIN_FUNCTION(impl, r < 0 ? EXIT_FAILURE : EXIT_SUCCESS) + _DEFINE_MAIN_FUNCTION(,impl(argc, argv), r < 0 ? EXIT_FAILURE : EXIT_SUCCESS) /* Zero is mapped to EXIT_SUCCESS, negative values are mapped to EXIT_FAILURE, * and postive values are propagated. * Note: "true" means failure! */ #define DEFINE_MAIN_FUNCTION_WITH_POSITIVE_FAILURE(impl) \ - _DEFINE_MAIN_FUNCTION(impl, r < 0 ? EXIT_FAILURE : r) + _DEFINE_MAIN_FUNCTION(,impl(argc, argv), r < 0 ? EXIT_FAILURE : r) diff --git a/src/sysv-generator/sysv-generator.c b/src/sysv-generator/sysv-generator.c index c4acdc4a50..514b6e0169 100644 --- a/src/sysv-generator/sysv-generator.c +++ b/src/sysv-generator/sysv-generator.c @@ -42,7 +42,7 @@ static const struct { * means they are shut down anyway at system power off if running. */ }; -static const char *arg_dest = "/tmp"; +static const char *arg_dest = NULL; typedef struct SysvStub { char *name; @@ -917,22 +917,14 @@ finish: return r; } -static int run(int argc, char *argv[]) { +static int run(const char *dest, const char *dest_early, const char *dest_late) { _cleanup_(free_sysvstub_hashmapp) Hashmap *all_services = NULL; _cleanup_(lookup_paths_free) LookupPaths lp = {}; SysvStub *service; Iterator j; int r; - log_setup_generator(); - - if (argc > 1 && argc != 4) { - log_error("This program takes three or no arguments."); - return -EINVAL; - } - - if (argc > 1) - arg_dest = argv[3]; + assert_se(arg_dest = dest_late); r = lookup_paths_init(&lp, UNIT_FILE_SYSTEM, LOOKUP_PATHS_EXCLUDE_GENERATED, NULL); if (r < 0) @@ -961,4 +953,4 @@ static int run(int argc, char *argv[]) { return 0; } -DEFINE_MAIN_FUNCTION(run); +DEFINE_MAIN_GENERATOR_FUNCTION(run); diff --git a/src/veritysetup/veritysetup-generator.c b/src/veritysetup/veritysetup-generator.c index 51996ec37e..65a4e7b0fd 100644 --- a/src/veritysetup/veritysetup-generator.c +++ b/src/veritysetup/veritysetup-generator.c @@ -204,16 +204,10 @@ static int determine_devices(void) { return 1; } -static int run(int argc, char *argv[]) { +static int run(const char *dest, const char *dest_early, const char *dest_late) { int r; - log_setup_generator(); - - if (argc > 1 && argc != 4) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program takes three or no arguments."); - - if (argc > 1) - arg_dest = argv[1]; + assert_se(arg_dest = dest); r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, PROC_CMDLINE_STRIP_RD_PREFIX); if (r < 0) @@ -229,11 +223,7 @@ static int run(int argc, char *argv[]) { if (r < 0) return r; - r = create_device(); - if (r < 0) - return r; - - return 0; + return create_device(); } -DEFINE_MAIN_FUNCTION(run); +DEFINE_MAIN_GENERATOR_FUNCTION(run); From bd020018f24791275ad8d7a8a909ea8a2540a5b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Tue, 4 Dec 2018 11:51:06 +0100 Subject: [PATCH 3/6] system-update-generator: use the new main function definer --- .../system-update-generator.c | 30 ++++++++----------- 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/src/system-update-generator/system-update-generator.c b/src/system-update-generator/system-update-generator.c index 80f53cf34c..77e265d710 100644 --- a/src/system-update-generator/system-update-generator.c +++ b/src/system-update-generator/system-update-generator.c @@ -15,7 +15,7 @@ * Implements the logic described in systemd.offline-updates(7). */ -static const char *arg_dest = "/tmp"; +static const char *arg_dest = NULL; static int generate_symlink(void) { const char *p = NULL; @@ -51,26 +51,20 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat return 0; } -int main(int argc, char *argv[]) { - int r, k; +static int run(const char *dest, const char *dest_early, const char *dest_late) { + int r; - log_setup_generator(); - - if (argc > 1 && argc != 4) { - log_error("This program takes three or no arguments."); - return EXIT_FAILURE; - } - - if (argc > 1) - arg_dest = argv[2]; + assert_se(arg_dest = dest_early); r = generate_symlink(); + if (r < 0) + return r; - if (r > 0) { - k = proc_cmdline_parse(parse_proc_cmdline_item, NULL, 0); - if (k < 0) - log_warning_errno(k, "Failed to parse kernel command line, ignoring: %m"); - } + r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, 0); + if (r < 0) + log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m"); - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return 0; } + +DEFINE_MAIN_GENERATOR_FUNCTION(run); From ec6e959750f10c2916d62801d476907e599f9668 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Tue, 4 Dec 2018 11:52:26 +0100 Subject: [PATCH 4/6] gpt-auto-generator: use the new main function definer The first error is now returned. --- src/gpt-auto-generator/gpt-auto-generator.c | 26 +++++++-------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/src/gpt-auto-generator/gpt-auto-generator.c b/src/gpt-auto-generator/gpt-auto-generator.c index 80e7bb671f..a6d7bcc755 100644 --- a/src/gpt-auto-generator/gpt-auto-generator.c +++ b/src/gpt-auto-generator/gpt-auto-generator.c @@ -36,7 +36,7 @@ #include "util.h" #include "virt.h" -static const char *arg_dest = "/tmp"; +static const char *arg_dest = NULL; static bool arg_enabled = true; static bool arg_root_enabled = true; static bool arg_root_rw = false; @@ -668,22 +668,14 @@ static int add_mounts(void) { return enumerate_partitions(devno); } -int main(int argc, char *argv[]) { +static int run(const char *dest, const char *dest_early, const char *dest_late) { int r, k; - log_setup_generator(); - - if (argc > 1 && argc != 4) { - log_error("This program takes three or no arguments."); - return EXIT_FAILURE; - } - - if (argc > 1) - arg_dest = argv[3]; + assert_se(arg_dest = dest_late); if (detect_container() > 0) { log_debug("In a container, exiting."); - return EXIT_SUCCESS; + return 0; } r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, 0); @@ -692,19 +684,19 @@ int main(int argc, char *argv[]) { if (!arg_enabled) { log_debug("Disabled, exiting."); - return EXIT_SUCCESS; + return 0; } if (arg_root_enabled) r = add_root_mount(); - else - r = 0; if (!in_initrd()) { k = add_mounts(); - if (k < 0) + if (r >= 0) r = k; } - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return r; } + +DEFINE_MAIN_GENERATOR_FUNCTION(run); From 9d22f97b8772955d0c70bb802e7c84835655219c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Tue, 4 Dec 2018 11:53:48 +0100 Subject: [PATCH 5/6] getty-generator: use the new main function definer I changed the nulstr loop to a normal FOREACH_STRING loop. It seems clearer this way. --- src/getty-generator/getty-generator.c | 67 ++++++++++++--------------- 1 file changed, 30 insertions(+), 37 deletions(-) diff --git a/src/getty-generator/getty-generator.c b/src/getty-generator/getty-generator.c index e604ff79a1..35501b61f5 100644 --- a/src/getty-generator/getty-generator.c +++ b/src/getty-generator/getty-generator.c @@ -13,13 +13,13 @@ #include "mkdir.h" #include "path-util.h" #include "process-util.h" -#include "string-util.h" +#include "strv.h" #include "terminal-util.h" #include "unit-name.h" #include "util.h" #include "virt.h" -static const char *arg_dest = "/tmp"; +static const char *arg_dest = NULL; static int add_symlink(const char *fservice, const char *tservice) { char *from, *to; @@ -99,37 +99,21 @@ static int verify_tty(const char *name) { return 0; } -int main(int argc, char *argv[]) { - - static const char virtualization_consoles[] = - "hvc0\0" - "xvc0\0" - "hvsi0\0" - "sclp_line0\0" - "ttysclp0\0" - "3270!tty1\0"; - +static int run(const char *dest, const char *dest_early, const char *dest_late) { _cleanup_free_ char *active = NULL; const char *j; int r; - log_setup_generator(); - - if (argc > 1 && argc != 4) { - log_error("This program takes three or no arguments."); - return EXIT_FAILURE; - } - - if (argc > 1) - arg_dest = argv[1]; + assert_se(arg_dest = dest); if (detect_container() > 0) { _cleanup_free_ char *container_ttys = NULL; log_debug("Automatically adding console shell."); - if (add_symlink("console-getty.service", "console-getty.service") < 0) - return EXIT_FAILURE; + r = add_symlink("console-getty.service", "console-getty.service"); + if (r < 0) + return r; /* When $container_ttys is set for PID 1, spawn * gettys on all ptys named therein. Note that despite @@ -157,13 +141,14 @@ int main(int argc, char *argv[]) { if (!t) continue; - if (add_container_getty(t) < 0) - return EXIT_FAILURE; + r = add_container_getty(t); + if (r < 0) + return r; } } /* Don't add any further magic if we are in a container */ - return EXIT_SUCCESS; + return 0; } if (read_one_line_file("/sys/class/tty/console/active", &active) >= 0) { @@ -176,10 +161,8 @@ int main(int argc, char *argv[]) { _cleanup_free_ char *tty = NULL; tty = strndup(word, l); - if (!tty) { - log_oom(); - return EXIT_FAILURE; - } + if (!tty) + return log_oom(); /* We assume that gettys on virtual terminals are * started via manual configuration and do this magic @@ -191,23 +174,33 @@ int main(int argc, char *argv[]) { if (verify_tty(tty) < 0) continue; - if (add_serial_getty(tty) < 0) - return EXIT_FAILURE; + r = add_serial_getty(tty); + if (r < 0) + return r; } } /* Automatically add in a serial getty on the first * virtualizer console */ - NULSTR_FOREACH(j, virtualization_consoles) { - char *p; + FOREACH_STRING(j, + "hvc0", + "xvc0", + "hvsi0", + "sclp_line0", + "ttysclp0", + "3270!tty1") { + const char *p; p = strjoina("/sys/class/tty/", j); if (access(p, F_OK) < 0) continue; - if (add_serial_getty(j) < 0) - return EXIT_FAILURE; + r = add_serial_getty(j); + if (r < 0) + return r; } - return EXIT_SUCCESS; + return 0; } + +DEFINE_MAIN_GENERATOR_FUNCTION(run); From a3e7ea02824645c1e8afdc39d0386855e4158a84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Tue, 4 Dec 2018 14:00:19 +0100 Subject: [PATCH 6/6] fstab-generator: fix check for /sys It would work when the generator was run by systemd, since generators are always started in "/", but when running the generator for debugging purposes the result would be ... different. --- src/fstab-generator/fstab-generator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fstab-generator/fstab-generator.c b/src/fstab-generator/fstab-generator.c index d5e5412059..616b42f33f 100644 --- a/src/fstab-generator/fstab-generator.c +++ b/src/fstab-generator/fstab-generator.c @@ -539,7 +539,7 @@ static int parse_fstab(bool initrd) { if (!what) return log_oom(); - if (is_device_path(what) && path_is_read_only_fs("sys") > 0) { + if (is_device_path(what) && path_is_read_only_fs("/sys") > 0) { log_info("Running in a container, ignoring fstab device entry for %s.", what); continue; }