diff --git a/src/cryptsetup/cryptsetup-generator.c b/src/cryptsetup/cryptsetup-generator.c index 8a889e980a..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; - 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(); + 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 24bc4bd7e2..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; - 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]; - - log_setup_generator(); + 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 85cc36d80d..616b42f33f 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; @@ -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; } @@ -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; - 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]; - - log_setup_generator(); + 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/getty-generator/getty-generator.c b/src/getty-generator/getty-generator.c index e2e07bca76..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; - if (argc > 1 && argc != 4) { - log_error("This program takes three or no arguments."); - return EXIT_FAILURE; - } - - if (argc > 1) - arg_dest = argv[1]; - - log_setup_generator(); + 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); diff --git a/src/gpt-auto-generator/gpt-auto-generator.c b/src/gpt-auto-generator/gpt-auto-generator.c index d188927398..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; - if (argc > 1 && argc != 4) { - log_error("This program takes three or no arguments."); - return EXIT_FAILURE; - } - - if (argc > 1) - arg_dest = argv[3]; - - log_setup_generator(); + 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); 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/system-update-generator/system-update-generator.c b/src/system-update-generator/system-update-generator.c index 06062e4510..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; - if (argc > 1 && argc != 4) { - log_error("This program takes three or no arguments."); - return EXIT_FAILURE; - } - - if (argc > 1) - arg_dest = argv[2]; - - log_setup_generator(); + 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); 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 0f5830a6e2..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; - 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(); + 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);