diff options
Diffstat (limited to 'src')
32 files changed, 472 insertions, 701 deletions
diff --git a/src/ac-power/ac-power.c b/src/ac-power/ac-power.c index 7ca72ef5f5..2d8cbb985f 100644 --- a/src/ac-power/ac-power.c +++ b/src/ac-power/ac-power.c @@ -63,7 +63,7 @@ static int parse_argv(int argc, char *argv[]) { return 1; } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { int r; /* This is mostly intended to be used for scripts which want @@ -74,17 +74,16 @@ int main(int argc, char *argv[]) { r = parse_argv(argc, argv); if (r <= 0) - goto finish; + return r; r = on_ac_power(); - if (r < 0) { - log_error_errno(r, "Failed to read AC status: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to read AC status: %m"); if (arg_verbose) puts(yes_no(r)); -finish: - return r < 0 ? EXIT_FAILURE : !r; + return r == 0; } + +DEFINE_MAIN_FUNCTION_WITH_POSITIVE_FAILURE(run); diff --git a/src/basic/macro.h b/src/basic/macro.h index 00fb3212db..c52d8e4e3f 100644 --- a/src/basic/macro.h +++ b/src/basic/macro.h @@ -506,4 +506,23 @@ static inline int __coverity_check__(int condition) { DEFINE_PUBLIC_TRIVIAL_REF_FUNC(type, name); \ DEFINE_PUBLIC_TRIVIAL_UNREF_FUNC(type, name, free_func); +/* Negative return values from impl are mapped to EXIT_FAILURE, and + * everything else means success! */ +#define DEFINE_MAIN_FUNCTION(impl) \ + int main(int argc, char *argv[]) { \ + int r; \ + r = impl(argc, argv); \ + return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; \ + } + +/* Zero is mapped to EXIT_SUCCESS, and both negative and positive values + * are mapped to EXIT_FAILURE. + * Note: this means "true" maps to EXIT_FAILURE. */ +#define DEFINE_MAIN_FUNCTION_WITH_POSITIVE_FAILURE(impl) \ + int main(int argc, char *argv[]) { \ + int r; \ + r = impl(argc, argv); \ + return r != 0 ? EXIT_FAILURE : EXIT_SUCCESS; \ + } + #include "log.h" diff --git a/src/boot/boot-check-no-failures.c b/src/boot/boot-check-no-failures.c index e7884461c6..1674517d48 100644 --- a/src/boot/boot-check-no-failures.c +++ b/src/boot/boot-check-no-failures.c @@ -61,7 +61,7 @@ static int parse_argv(int argc, char *argv[]) { return 1; } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL; uint32_t n; @@ -72,13 +72,11 @@ int main(int argc, char *argv[]) { r = parse_argv(argc, argv); if (r <= 0) - goto finish; + return r; r = sd_bus_open_system(&bus); - if (r < 0) { - log_error_errno(r, "Failed to connect to system bus: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to connect to system bus: %m"); r = sd_bus_get_property_trivial( bus, @@ -89,18 +87,15 @@ int main(int argc, char *argv[]) { &error, 'u', &n); - if (r < 0) { - log_error_errno(r, "Failed to get failed units counter: %s", bus_error_message(&error, r)); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to get failed units counter: %s", bus_error_message(&error, r)); if (n > 0) log_notice("Health check: %" PRIu32 " units have failed.", n); else log_info("Health check: no failed units."); - r = n > 0 ? EXIT_FAILURE : EXIT_SUCCESS; - -finish: - return r < 0 ? EXIT_FAILURE : r; + return n > 0; } + +DEFINE_MAIN_FUNCTION_WITH_POSITIVE_FAILURE(run); diff --git a/src/cgtop/cgtop.c b/src/cgtop/cgtop.c index af2ef853bd..2cc869dcbd 100644 --- a/src/cgtop/cgtop.c +++ b/src/cgtop/cgtop.c @@ -733,7 +733,6 @@ static int help(void) { } static int parse_argv(int argc, char *argv[]) { - enum { ARG_VERSION = 0x100, ARG_DEPTH, @@ -908,7 +907,7 @@ static const char* counting_what(void) { return "userspace processes (excl. kernel)"; } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { _cleanup_(group_hashmap_freep) Hashmap *a = NULL, *b = NULL; unsigned iteration = 0; usec_t last_refresh = 0; @@ -922,13 +921,11 @@ int main(int argc, char *argv[]) { r = parse_argv(argc, argv); if (r <= 0) - goto finish; + return r; r = cg_mask_supported(&mask); - if (r < 0) { - log_error_errno(r, "Failed to determine supported controllers: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to determine supported controllers: %m"); arg_count = (mask & CGROUP_MASK_PIDS) ? COUNT_PIDS : COUNT_USERSPACE_PROCESSES; @@ -938,18 +935,14 @@ int main(int argc, char *argv[]) { } r = show_cgroup_get_path_and_warn(arg_machine, arg_root, &root); - if (r < 0) { - log_error_errno(r, "Failed to get root control group path: %m"); - goto finish; - } else - log_debug("Cgroup path: %s", root); + if (r < 0) + return log_error_errno(r, "Failed to get root control group path: %m"); + log_debug("Cgroup path: %s", root); a = hashmap_new(&path_hash_ops); b = hashmap_new(&path_hash_ops); - if (!a || !b) { - r = log_oom(); - goto finish; - } + if (!a || !b) + return log_oom(); signal(SIGWINCH, columns_lines_cache_reset); @@ -967,10 +960,8 @@ int main(int argc, char *argv[]) { if (t >= last_refresh + arg_delay || immediate_refresh) { r = refresh(root, a, b, iteration++); - if (r < 0) { - log_error_errno(r, "Failed to refresh: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to refresh: %m"); group_hashmap_clear(b); @@ -997,10 +988,8 @@ int main(int argc, char *argv[]) { r = read_one_char(stdin, &key, last_refresh + arg_delay - t, NULL); if (r == -ETIMEDOUT) continue; - if (r < 0) { - log_error_errno(r, "Couldn't read key: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Couldn't read key: %m"); } if (on_tty()) { /* TTY: Clear any user keystroke */ @@ -1120,9 +1109,7 @@ int main(int argc, char *argv[]) { } } - r = 0; - -finish: - - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return 0; } + +DEFINE_MAIN_FUNCTION(run); diff --git a/src/coredump/coredump.c b/src/coredump/coredump.c index 0ca8b3f00e..764ee2a945 100644 --- a/src/coredump/coredump.c +++ b/src/coredump/coredump.c @@ -1376,7 +1376,7 @@ static int process_backtrace(int argc, char *argv[]) { return r; } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { int r; /* First, log to a safe place, since we don't know what crashed and it might @@ -1395,25 +1395,21 @@ int main(int argc, char *argv[]) { log_debug("Selected compression %s.", yes_no(arg_compress)); r = sd_listen_fds(false); - if (r < 0) { - log_error_errno(r, "Failed to determine number of file descriptor: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to determine the number of file descriptors: %m"); /* If we got an fd passed, we are running in coredumpd mode. Otherwise we * are invoked from the kernel as coredump handler. */ if (r == 0) { if (streq_ptr(argv[1], "--backtrace")) - r = process_backtrace(argc, argv); + return process_backtrace(argc, argv); else - r = process_kernel(argc, argv); + return process_kernel(argc, argv); } else if (r == 1) - r = process_socket(SD_LISTEN_FDS_START); - else { - log_error("Received unexpected number of file descriptors."); - r = -EINVAL; - } + return process_socket(SD_LISTEN_FDS_START); -finish: - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + log_error("Received unexpected number of file descriptors."); + return -EINVAL; } + +DEFINE_MAIN_FUNCTION(run); diff --git a/src/detect-virt/detect-virt.c b/src/detect-virt/detect-virt.c index b98ddbd0c6..d1a2ab95a0 100644 --- a/src/detect-virt/detect-virt.c +++ b/src/detect-virt/detect-virt.c @@ -120,7 +120,7 @@ static int parse_argv(int argc, char *argv[]) { return 1; } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { int r; /* This is mostly intended to be used for scripts which want @@ -132,59 +132,45 @@ int main(int argc, char *argv[]) { r = parse_argv(argc, argv); if (r <= 0) - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return r; switch (arg_mode) { - case ONLY_VM: r = detect_vm(); - if (r < 0) { - log_error_errno(r, "Failed to check for VM: %m"); - return EXIT_FAILURE; - } - + if (r < 0) + return log_error_errno(r, "Failed to check for VM: %m"); break; case ONLY_CONTAINER: r = detect_container(); - if (r < 0) { - log_error_errno(r, "Failed to check for container: %m"); - return EXIT_FAILURE; - } - + if (r < 0) + return log_error_errno(r, "Failed to check for container: %m"); break; case ONLY_CHROOT: r = running_in_chroot(); - if (r < 0) { - log_error_errno(r, "Failed to check for chroot() environment: %m"); - return EXIT_FAILURE; - } - - return r ? EXIT_SUCCESS : EXIT_FAILURE; + if (r < 0) + return log_error_errno(r, "Failed to check for chroot() environment: %m"); + return !r; case ONLY_PRIVATE_USERS: r = running_in_userns(); - if (r < 0) { - log_error_errno(r, "Failed to check for user namespace: %m"); - return EXIT_FAILURE; - } - - return r ? EXIT_SUCCESS : EXIT_FAILURE; + if (r < 0) + return log_error_errno(r, "Failed to check for user namespace: %m"); + return !r; case ANY_VIRTUALIZATION: default: r = detect_virtualization(); - if (r < 0) { - log_error_errno(r, "Failed to check for virtualization: %m"); - return EXIT_FAILURE; - } - + if (r < 0) + return log_error_errno(r, "Failed to check for virtualization: %m"); break; } if (!arg_quiet) puts(virtualization_to_string(r)); - return r != VIRTUALIZATION_NONE ? EXIT_SUCCESS : EXIT_FAILURE; + return r == VIRTUALIZATION_NONE; } + +DEFINE_MAIN_FUNCTION_WITH_POSITIVE_FAILURE(run); diff --git a/src/escape/escape.c b/src/escape/escape.c index c5cb7897a9..ed42ad65ad 100644 --- a/src/escape/escape.c +++ b/src/escape/escape.c @@ -163,7 +163,7 @@ static int parse_argv(int argc, char *argv[]) { return 1; } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { char **i; int r; @@ -172,7 +172,7 @@ int main(int argc, char *argv[]) { r = parse_argv(argc, argv); if (r <= 0) - goto finish; + return r; STRV_FOREACH(i, argv + optind) { _cleanup_free_ char *e = NULL; @@ -182,40 +182,30 @@ int main(int argc, char *argv[]) { case ACTION_ESCAPE: if (arg_path) { r = unit_name_path_escape(*i, &e); - if (r < 0) { - log_error_errno(r, "Failed to escape string: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to escape string: %m"); } else { e = unit_name_escape(*i); - if (!e) { - r = log_oom(); - goto finish; - } + if (!e) + return log_oom(); } if (arg_template) { char *x; r = unit_name_replace_instance(arg_template, e, &x); - if (r < 0) { - log_error_errno(r, "Failed to replace instance: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to replace instance: %m"); - free(e); - e = x; + free_and_replace(e, x); } else if (arg_suffix) { char *x; x = strjoin(e, ".", arg_suffix); - if (!x) { - r = log_oom(); - goto finish; - } + if (!x) + return log_oom(); - free(e); - e = x; + free_and_replace(e, x); } break; @@ -227,55 +217,42 @@ int main(int argc, char *argv[]) { _cleanup_free_ char *template = NULL; r = unit_name_to_instance(*i, &name); - if (r < 0) { - log_error_errno(r, "Failed to extract instance: %m"); - goto finish; - } - if (isempty(name)) { - log_error("Unit %s is missing the instance name.", *i); - r = -EINVAL; - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to extract instance: %m"); + if (isempty(name)) + return log_error("Unit %s is missing the instance name.", *i); + r = unit_name_template(*i, &template); - if (r < 0) { - log_error_errno(r, "Failed to extract template: %m"); - goto finish; - } - if (arg_template && !streq(arg_template, template)) { - log_error("Unit %s template %s does not match specified template %s.", *i, template, arg_template); - r = -EINVAL; - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to extract template: %m"); + if (arg_template && !streq(arg_template, template)) + return log_error("Unit %s template %s does not match specified template %s.", + *i, template, arg_template); } else { name = strdup(*i); - if (!name) { - r = log_oom(); - goto finish; - } + if (!name) + return log_oom(); } if (arg_path) r = unit_name_path_unescape(name, &e); else r = unit_name_unescape(name, &e); + if (r < 0) + return log_error_errno(r, "Failed to unescape string: %m"); - if (r < 0) { - log_error_errno(r, "Failed to unescape string: %m"); - goto finish; - } break; } case ACTION_MANGLE: r = unit_name_mangle(*i, 0, &e); - if (r < 0) { - log_error_errno(r, "Failed to mangle name: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to mangle name: %m"); + break; } - if (i != argv+optind) + if (i != argv + optind) fputc(' ', stdout); fputs(e, stdout); @@ -283,6 +260,7 @@ int main(int argc, char *argv[]) { fputc('\n', stdout); -finish: - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return 0; } + +DEFINE_MAIN_FUNCTION(run); diff --git a/src/fsck/fsck.c b/src/fsck/fsck.c index 65928ed2e3..54d6d26fb5 100644 --- a/src/fsck/fsck.c +++ b/src/fsck/fsck.c @@ -260,7 +260,7 @@ static int fsck_progress_socket(void) { return TAKE_FD(fd); } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { _cleanup_close_pair_ int progress_pipe[2] = { -1, -1 }; _cleanup_(sd_device_unrefp) sd_device *dev = NULL; const char *device, *type; @@ -269,15 +269,15 @@ int main(int argc, char *argv[]) { int r, exit_status; pid_t pid; - if (argc > 2) { - log_error("This program expects one or no arguments."); - return EXIT_FAILURE; - } - log_set_target(LOG_TARGET_AUTO); log_parse_environment(); log_open(); + if (argc > 2) { + log_error("This program expects one or no arguments."); + return -EINVAL; + } + umask(0022); r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, PROC_CMDLINE_STRIP_RD_PREFIX); @@ -286,30 +286,23 @@ int main(int argc, char *argv[]) { test_files(); - if (!arg_force && arg_skip) { - r = 0; - goto finish; - } + if (!arg_force && arg_skip) + return 0; if (argc > 1) { device = argv[1]; - if (stat(device, &st) < 0) { - r = log_error_errno(errno, "Failed to stat %s: %m", device); - goto finish; - } + if (stat(device, &st) < 0) + return log_error_errno(errno, "Failed to stat %s: %m", device); if (!S_ISBLK(st.st_mode)) { log_error("%s is not a block device.", device); - r = -EINVAL; - goto finish; + return -EINVAL; } r = sd_device_new_from_devnum(&dev, 'b', st.st_rdev); - if (r < 0) { - log_error_errno(r, "Failed to detect device %s: %m", device); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to detect device %s: %m", device); root_directory = false; } else { @@ -317,16 +310,13 @@ int main(int argc, char *argv[]) { /* Find root device */ - if (stat("/", &st) < 0) { - r = log_error_errno(errno, "Failed to stat() the root directory: %m"); - goto finish; - } + if (stat("/", &st) < 0) + return log_error_errno(errno, "Failed to stat() the root directory: %m"); /* Virtual root devices don't need an fsck */ if (major(st.st_dev) == 0) { log_debug("Root directory is virtual or btrfs, skipping check."); - r = 0; - goto finish; + return 0; } /* check if we are already writable */ @@ -335,21 +325,16 @@ int main(int argc, char *argv[]) { if (utimensat(AT_FDCWD, "/", times, 0) == 0) { log_info("Root directory is writable, skipping check."); - r = 0; - goto finish; + return 0; } r = sd_device_new_from_devnum(&dev, 'b', st.st_dev); - if (r < 0) { - log_error_errno(r, "Failed to detect root device: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to detect root device: %m"); r = sd_device_get_devname(dev, &device); - if (r < 0) { - log_device_error_errno(dev, r, "Failed to detect device node of root directory: %m"); - goto finish; - } + if (r < 0) + return log_device_error_errno(dev, r, "Failed to detect device node of root directory: %m"); root_directory = true; } @@ -360,20 +345,17 @@ int main(int argc, char *argv[]) { log_device_warning_errno(dev, r, "Couldn't detect if fsck.%s may be used, proceeding: %m", type); else if (r == 0) { log_device_info(dev, "fsck.%s doesn't exist, not checking file system.", type); - goto finish; + return 0; } } - if (arg_show_progress) { - if (pipe(progress_pipe) < 0) { - r = log_error_errno(errno, "pipe(): %m"); - goto finish; - } - } + if (arg_show_progress && + pipe(progress_pipe) < 0) + return log_error_errno(errno, "pipe(): %m"); r = safe_fork("(fsck)", FORK_RESET_SIGNALS|FORK_DEATHSIG|FORK_LOG, &pid); if (r < 0) - goto finish; + return r; if (r == 0) { char dash_c[STRLEN("-C") + DECIMAL_STR_MAX(int) + 1]; int progress_socket = -1; @@ -425,35 +407,29 @@ int main(int argc, char *argv[]) { } progress_pipe[1] = safe_close(progress_pipe[1]); - (void) process_progress(progress_pipe[0]); - progress_pipe[0] = -1; + (void) process_progress(TAKE_FD(progress_pipe[0])); exit_status = wait_for_terminate_and_check("fsck", pid, WAIT_LOG_ABNORMAL); - if (exit_status < 0) { - r = exit_status; - goto finish; - } + if (exit_status < 0) + return exit_status; if (exit_status & ~1) { log_error("fsck failed with exit status %i.", exit_status); if ((exit_status & FSCK_SYSTEM_SHOULD_REBOOT) && root_directory) { /* System should be rebooted. */ start_target(SPECIAL_REBOOT_TARGET, "replace-irreversibly"); - r = -EINVAL; - } else if (exit_status & (FSCK_SYSTEM_SHOULD_REBOOT | FSCK_ERRORS_LEFT_UNCORRECTED)) { + return -EINVAL; + } else if (exit_status & (FSCK_SYSTEM_SHOULD_REBOOT | FSCK_ERRORS_LEFT_UNCORRECTED)) /* Some other problem */ start_target(SPECIAL_EMERGENCY_TARGET, "replace"); - r = -EINVAL; - } else { + else log_warning("Ignoring error."); - r = 0; - } - } else - r = 0; + } if (exit_status & FSCK_ERROR_CORRECTED) (void) touch("/run/systemd/quotacheck"); -finish: - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return exit_status & (FSCK_SYSTEM_SHOULD_REBOOT | FSCK_ERRORS_LEFT_UNCORRECTED); } + +DEFINE_MAIN_FUNCTION_WITH_POSITIVE_FAILURE(run); diff --git a/src/hostname/hostnamectl.c b/src/hostname/hostnamectl.c index be94de4994..8220741efa 100644 --- a/src/hostname/hostnamectl.c +++ b/src/hostname/hostnamectl.c @@ -426,7 +426,7 @@ static int hostnamectl_main(sd_bus *bus, int argc, char *argv[]) { return dispatch_verb(argc, argv, verbs, bus); } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL; int r; @@ -436,16 +436,13 @@ int main(int argc, char *argv[]) { r = parse_argv(argc, argv); if (r <= 0) - goto finish; + return r; r = bus_connect_transport(arg_transport, arg_host, false, &bus); - if (r < 0) { - log_error_errno(r, "Failed to create bus connection: %m"); - goto finish; - } - - r = hostnamectl_main(bus, argc, argv); + if (r < 0) + return log_error_errno(r, "Failed to create bus connection: %m"); -finish: - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return hostnamectl_main(bus, argc, argv); } + +DEFINE_MAIN_FUNCTION(run); diff --git a/src/hwdb/hwdb.c b/src/hwdb/hwdb.c index be64a26d64..87b84b70a9 100644 --- a/src/hwdb/hwdb.c +++ b/src/hwdb/hwdb.c @@ -110,7 +110,7 @@ static int hwdb_main(int argc, char *argv[]) { return dispatch_verb(argc, argv, verbs, NULL); } -int main (int argc, char *argv[]) { +static int run(int argc, char *argv[]) { int r; log_parse_environment(); @@ -118,12 +118,11 @@ int main (int argc, char *argv[]) { r = parse_argv(argc, argv); if (r <= 0) - goto finish; + return r; mac_selinux_init(); - r = hwdb_main(argc, argv); - -finish: - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return hwdb_main(argc, argv); } + +DEFINE_MAIN_FUNCTION(run); diff --git a/src/id128/id128.c b/src/id128/id128.c index fe325042e0..6b7045b3e7 100644 --- a/src/id128/id128.c +++ b/src/id128/id128.c @@ -150,7 +150,7 @@ static int id128_main(int argc, char *argv[]) { return dispatch_verb(argc, argv, verbs, NULL); } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { int r; log_parse_environment(); @@ -158,10 +158,9 @@ int main(int argc, char *argv[]) { r = parse_argv(argc, argv); if (r <= 0) - goto finish; + return r; - r = id128_main(argc, argv); - - finish: - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return id128_main(argc, argv); } + +DEFINE_MAIN_FUNCTION(run); diff --git a/src/import/export.c b/src/import/export.c index 03eb3e40b2..317ac1bba7 100644 --- a/src/import/export.c +++ b/src/import/export.c @@ -269,7 +269,6 @@ static int parse_argv(int argc, char *argv[]) { } static int export_main(int argc, char *argv[]) { - static const Verb verbs[] = { { "help", VERB_ANY, VERB_ANY, 0, help }, { "tar", 2, 3, 0, export_tar }, @@ -280,7 +279,7 @@ static int export_main(int argc, char *argv[]) { return dispatch_verb(argc, argv, verbs, NULL); } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { int r; setlocale(LC_ALL, ""); @@ -289,12 +288,11 @@ int main(int argc, char *argv[]) { r = parse_argv(argc, argv); if (r <= 0) - goto finish; + return r; (void) ignore_signals(SIGPIPE, -1); - r = export_main(argc, argv); - -finish: - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return export_main(argc, argv); } + +DEFINE_MAIN_FUNCTION(run); diff --git a/src/import/import.c b/src/import/import.c index 35c8e6d630..69fe8a8a37 100644 --- a/src/import/import.c +++ b/src/import/import.c @@ -292,7 +292,6 @@ static int parse_argv(int argc, char *argv[]) { } static int import_main(int argc, char *argv[]) { - static const Verb verbs[] = { { "help", VERB_ANY, VERB_ANY, 0, help }, { "tar", 2, 3, 0, import_tar }, @@ -303,7 +302,7 @@ static int import_main(int argc, char *argv[]) { return dispatch_verb(argc, argv, verbs, NULL); } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { int r; setlocale(LC_ALL, ""); @@ -312,12 +311,11 @@ int main(int argc, char *argv[]) { r = parse_argv(argc, argv); if (r <= 0) - goto finish; + return 0; (void) ignore_signals(SIGPIPE, -1); - r = import_main(argc, argv); - -finish: - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return import_main(argc, argv); } + +DEFINE_MAIN_FUNCTION(run); diff --git a/src/import/importd.c b/src/import/importd.c index 57190e5de5..b5265a7ed3 100644 --- a/src/import/importd.c +++ b/src/import/importd.c @@ -1113,7 +1113,7 @@ static int manager_run(Manager *m) { m); } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { _cleanup_(manager_unrefp) Manager *m = NULL; int r; @@ -1125,28 +1125,24 @@ int main(int argc, char *argv[]) { if (argc != 1) { log_error("This program takes no arguments."); - r = -EINVAL; - goto finish; + return -EINVAL; } assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, -1) >= 0); r = manager_new(&m); - if (r < 0) { - log_error_errno(r, "Failed to allocate manager object: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to allocate manager object: %m"); r = manager_add_bus_objects(m); if (r < 0) - goto finish; + return r; r = manager_run(m); - if (r < 0) { - log_error_errno(r, "Failed to run event loop: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to run event loop: %m"); -finish: - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return 0; } + +DEFINE_MAIN_FUNCTION(run); diff --git a/src/import/pull.c b/src/import/pull.c index ef495de068..821c9772e4 100644 --- a/src/import/pull.c +++ b/src/import/pull.c @@ -304,7 +304,6 @@ static int parse_argv(int argc, char *argv[]) { } static int pull_main(int argc, char *argv[]) { - static const Verb verbs[] = { { "help", VERB_ANY, VERB_ANY, 0, help }, { "tar", 2, 3, 0, pull_tar }, @@ -315,7 +314,7 @@ static int pull_main(int argc, char *argv[]) { return dispatch_verb(argc, argv, verbs, NULL); } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { int r; setlocale(LC_ALL, ""); @@ -324,12 +323,11 @@ int main(int argc, char *argv[]) { r = parse_argv(argc, argv); if (r <= 0) - goto finish; + return r; (void) ignore_signals(SIGPIPE, -1); - r = pull_main(argc, argv); - -finish: - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return pull_main(argc, argv); } + +DEFINE_MAIN_FUNCTION(run); diff --git a/src/journal/cat.c b/src/journal/cat.c index 8cc4580d0b..1576199deb 100644 --- a/src/journal/cat.c +++ b/src/journal/cat.c @@ -112,7 +112,7 @@ static int parse_argv(int argc, char *argv[]) { return 1; } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { _cleanup_close_ int fd = -1, saved_stderr = -1; int r; @@ -121,22 +121,18 @@ int main(int argc, char *argv[]) { r = parse_argv(argc, argv); if (r <= 0) - goto finish; + return r; fd = sd_journal_stream_fd(arg_identifier, arg_priority, arg_level_prefix); - if (fd < 0) { - r = log_error_errno(fd, "Failed to create stream fd: %m"); - goto finish; - } + if (fd < 0) + return log_error_errno(fd, "Failed to create stream fd: %m"); saved_stderr = fcntl(STDERR_FILENO, F_DUPFD_CLOEXEC, 3); r = rearrange_stdio(STDIN_FILENO, fd, fd); /* Invalidates fd on succcess + error! */ - fd = -1; - if (r < 0) { - log_error_errno(r, "Failed to rearrange stdout/stderr: %m"); - goto finish; - } + TAKE_FD(fd); + if (r < 0) + return log_error_errno(r, "Failed to rearrange stdout/stderr: %m"); if (argc <= optind) (void) execl("/bin/cat", "/bin/cat", NULL); @@ -148,8 +144,7 @@ int main(int argc, char *argv[]) { if (saved_stderr >= 0) (void) dup3(saved_stderr, STDERR_FILENO, 0); - log_error_errno(r, "Failed to execute process: %m"); - -finish: - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return log_error_errno(r, "Failed to execute process: %m"); } + +DEFINE_MAIN_FUNCTION(run); diff --git a/src/login/inhibit.c b/src/login/inhibit.c index 22fee49a2b..ca24aea5a7 100644 --- a/src/login/inhibit.c +++ b/src/login/inhibit.c @@ -266,7 +266,7 @@ static int parse_argv(int argc, char *argv[]) { return 1; } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL; int r; @@ -274,23 +274,17 @@ int main(int argc, char *argv[]) { log_open(); r = parse_argv(argc, argv); - if (r < 0) - return EXIT_FAILURE; - if (r == 0) - return EXIT_SUCCESS; + if (r <= 0) + return r; r = sd_bus_default_system(&bus); - if (r < 0) { - log_error_errno(r, "Failed to connect to bus: %m"); - return EXIT_FAILURE; - } + if (r < 0) + return log_error_errno(r, "Failed to connect to bus: %m"); if (arg_action == ACTION_LIST) { - r = print_inhibitors(bus); pager_close(); - if (r < 0) - return EXIT_FAILURE; + return r; } else { _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; @@ -308,14 +302,12 @@ int main(int argc, char *argv[]) { arg_mode = "block"; fd = inhibit(bus, &error); - if (fd < 0) { - log_error("Failed to inhibit: %s", bus_error_message(&error, fd)); - return EXIT_FAILURE; - } + if (fd < 0) + return log_error("Failed to inhibit: %s", bus_error_message(&error, fd)); r = safe_fork("(inhibit)", FORK_RESET_SIGNALS|FORK_DEATHSIG|FORK_CLOSE_ALL_FDS|FORK_LOG, &pid); if (r < 0) - return EXIT_FAILURE; + return r; if (r == 0) { /* Child */ execvp(argv[optind], argv + optind); @@ -324,9 +316,8 @@ int main(int argc, char *argv[]) { _exit(EXIT_FAILURE); } - r = wait_for_terminate_and_check(argv[optind], pid, WAIT_LOG); - return r < 0 ? EXIT_FAILURE : r; + return wait_for_terminate_and_check(argv[optind], pid, WAIT_LOG); } - - return EXIT_SUCCESS; } + +DEFINE_MAIN_FUNCTION_WITH_POSITIVE_FAILURE(run); diff --git a/src/login/logind.c b/src/login/logind.c index a1ab9626b5..e71ac0ee6d 100644 --- a/src/login/logind.c +++ b/src/login/logind.c @@ -1166,7 +1166,7 @@ static int manager_run(Manager *m) { } } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { _cleanup_(manager_unrefp) Manager *m = NULL; int r; @@ -1179,15 +1179,12 @@ int main(int argc, char *argv[]) { if (argc != 1) { log_error("This program takes no arguments."); - r = -EINVAL; - goto finish; + return -EINVAL; } r = mac_selinux_init(); - if (r < 0) { - log_error_errno(r, "Could not initialize labelling: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Could not initialize labelling: %m"); /* Always create the directories people can create inotify watches in. Note that some applications might check * for the existence of /run/systemd/seats/ to determine whether logind is available, so please always make @@ -1199,21 +1196,16 @@ int main(int argc, char *argv[]) { assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGHUP, SIGTERM, SIGINT, -1) >= 0); r = manager_new(&m); - if (r < 0) { - log_error_errno(r, "Failed to allocate manager object: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to allocate manager object: %m"); (void) manager_parse_config_file(m); r = manager_startup(m); - if (r < 0) { - log_error_errno(r, "Failed to fully start up daemon: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to fully start up daemon: %m"); log_debug("systemd-logind running as pid "PID_FMT, getpid_cached()); - (void) sd_notify(false, "READY=1\n" "STATUS=Processing requests..."); @@ -1221,11 +1213,11 @@ int main(int argc, char *argv[]) { r = manager_run(m); log_debug("systemd-logind stopped as pid "PID_FMT, getpid_cached()); - (void) sd_notify(false, "STOPPING=1\n" "STATUS=Shutting down..."); -finish: - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return r; } + +DEFINE_MAIN_FUNCTION(run); diff --git a/src/login/user-runtime-dir.c b/src/login/user-runtime-dir.c index a149e96b26..b3a6e5c740 100644 --- a/src/login/user-runtime-dir.c +++ b/src/login/user-runtime-dir.c @@ -168,7 +168,7 @@ static int do_umount(const char *user) { return user_remove_runtime_path(runtime_path); } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { int r; log_parse_environment(); @@ -176,27 +176,24 @@ int main(int argc, char *argv[]) { if (argc != 3) { log_error("This program takes two arguments."); - return EXIT_FAILURE; + return -EINVAL; } if (!STR_IN_SET(argv[1], "start", "stop")) { log_error("First argument must be either \"start\" or \"stop\"."); - return EXIT_FAILURE; + return -EINVAL; } r = mac_selinux_init(); - if (r < 0) { - log_error_errno(r, "Could not initialize labelling: %m\n"); - return EXIT_FAILURE; - } + if (r < 0) + return log_error_errno(r, "Could not initialize labelling: %m\n"); umask(0022); if (streq(argv[1], "start")) - r = do_mount(argv[2]); - else if (streq(argv[1], "stop")) - r = do_umount(argv[2]); - else - assert_not_reached("Unknown verb!"); - - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return do_mount(argv[2]); + if (streq(argv[1], "stop")) + return do_umount(argv[2]); + assert_not_reached("Unknown verb!"); } + +DEFINE_MAIN_FUNCTION(run); diff --git a/src/machine/machined.c b/src/machine/machined.c index a6f0d847d5..24850af5bc 100644 --- a/src/machine/machined.c +++ b/src/machine/machined.c @@ -345,7 +345,7 @@ static int manager_run(Manager *m) { check_idle, m); } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { _cleanup_(manager_unrefp) Manager *m = NULL; int r; @@ -358,8 +358,7 @@ int main(int argc, char *argv[]) { if (argc != 1) { log_error("This program takes no arguments."); - r = -EINVAL; - goto finish; + return -EINVAL; } /* Always create the directories people can create inotify watches in. Note that some applications might check @@ -370,19 +369,14 @@ int main(int argc, char *argv[]) { assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, SIGTERM, SIGINT, -1) >= 0); r = manager_new(&m); - if (r < 0) { - log_error_errno(r, "Failed to allocate manager object: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to allocate manager object: %m"); r = manager_startup(m); - if (r < 0) { - log_error_errno(r, "Failed to fully start up daemon: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to fully start up daemon: %m"); log_debug("systemd-machined running as pid "PID_FMT, getpid_cached()); - (void) sd_notify(false, "READY=1\n" "STATUS=Processing requests..."); @@ -390,11 +384,11 @@ int main(int argc, char *argv[]) { r = manager_run(m); log_debug("systemd-machined stopped as pid "PID_FMT, getpid_cached()); - (void) sd_notify(false, "STOPPING=1\n" "STATUS=Shutting down..."); -finish: - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return r; } + +DEFINE_MAIN_FUNCTION(run); diff --git a/src/notify/notify.c b/src/notify/notify.c index 243af7ba81..149cd0d050 100644 --- a/src/notify/notify.c +++ b/src/notify/notify.c @@ -144,7 +144,7 @@ static int parse_argv(int argc, char *argv[]) { return 1; } -int main(int argc, char* argv[]) { +static int run(int argc, char* argv[]) { _cleanup_free_ char *status = NULL, *cpid = NULL, *n = NULL; _cleanup_strv_free_ char **final_env = NULL; char* our_env[4]; @@ -156,7 +156,7 @@ int main(int argc, char* argv[]) { r = parse_argv(argc, argv); if (r <= 0) - goto finish; + return r; if (arg_booted) return sd_booted() <= 0; @@ -166,19 +166,15 @@ int main(int argc, char* argv[]) { if (arg_status) { status = strappend("STATUS=", arg_status); - if (!status) { - r = log_oom(); - goto finish; - } + if (!status) + return log_oom(); our_env[i++] = status; } if (arg_pid > 0) { - if (asprintf(&cpid, "MAINPID="PID_FMT, arg_pid) < 0) { - r = log_oom(); - goto finish; - } + if (asprintf(&cpid, "MAINPID="PID_FMT, arg_pid) < 0) + return log_oom(); our_env[i++] = cpid; } @@ -186,47 +182,36 @@ int main(int argc, char* argv[]) { our_env[i++] = NULL; final_env = strv_env_merge(2, our_env, argv + optind); - if (!final_env) { - r = log_oom(); - goto finish; - } + if (!final_env) + return log_oom(); - if (strv_isempty(final_env)) { - r = 0; - goto finish; - } + if (strv_isempty(final_env)) + return 0; n = strv_join(final_env, "\n"); - if (!n) { - r = log_oom(); - goto finish; - } + if (!n) + return log_oom(); /* If this is requested change to the requested UID/GID. Note thta we only change the real UID here, and leave the effective UID in effect (which is 0 for this to work). That's because we want the privileges to fake the ucred data, and sd_pid_notify() uses the real UID for filling in ucred. */ - if (arg_gid != GID_INVALID) - if (setregid(arg_gid, (gid_t) -1) < 0) { - r = log_error_errno(errno, "Failed to change GID: %m"); - goto finish; - } + if (arg_gid != GID_INVALID && + setregid(arg_gid, (gid_t) -1) < 0) + return log_error_errno(errno, "Failed to change GID: %m"); - if (arg_uid != UID_INVALID) - if (setreuid(arg_uid, (uid_t) -1) < 0) { - r = log_error_errno(errno, "Failed to change UID: %m"); - goto finish; - } + if (arg_uid != UID_INVALID && + setreuid(arg_uid, (uid_t) -1) < 0) + return log_error_errno(errno, "Failed to change UID: %m"); r = sd_pid_notify(arg_pid ? arg_pid : getppid(), false, n); - if (r < 0) { - log_error_errno(r, "Failed to notify init system: %m"); - goto finish; - } else if (r == 0) { + if (r < 0) + return log_error_errno(r, "Failed to notify init system: %m"); + if (r == 0) { log_error("No status data could be sent: $NOTIFY_SOCKET was not set"); - r = -EOPNOTSUPP; + return -EOPNOTSUPP; } - -finish: - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return 0; } + +DEFINE_MAIN_FUNCTION(run); diff --git a/src/partition/makefs.c b/src/partition/makefs.c index 8c2a783e9d..dcc69c6a20 100644 --- a/src/partition/makefs.c +++ b/src/partition/makefs.c @@ -42,7 +42,7 @@ static int makefs(const char *type, const char *device) { return wait_for_terminate_and_check(mkfs, pid, WAIT_LOG); } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { const char *device, *type; _cleanup_free_ char *detected = NULL; struct stat st; @@ -54,37 +54,32 @@ int main(int argc, char *argv[]) { if (argc != 3) { log_error("This program expects two arguments."); - return EXIT_FAILURE; + return -EINVAL; } type = argv[1]; device = argv[2]; - if (stat(device, &st) < 0) { - r = log_error_errno(errno, "Failed to stat \"%s\": %m", device); - goto finish; - } + if (stat(device, &st) < 0) + return log_error_errno(errno, "Failed to stat \"%s\": %m", device); if (!S_ISBLK(st.st_mode)) log_info("%s is not a block device.", device); r = probe_filesystem(device, &detected); - if (r < 0) { - log_warning_errno(r, - r == -EUCLEAN ? - "Cannot reliably determine probe \"%s\", refusing to proceed." : - "Failed to probe \"%s\": %m", - device); - goto finish; - } + if (r < 0) + return log_warning_errno(r, + r == -EUCLEAN ? + "Cannot reliably determine probe \"%s\", refusing to proceed." : + "Failed to probe \"%s\": %m", + device); if (detected) { log_info("%s is not empty (type %s), exiting", device, detected); - goto finish; + return 0; } - r = makefs(type, device); - -finish: - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return makefs(type, device); } + +DEFINE_MAIN_FUNCTION(run); diff --git a/src/path/path.c b/src/path/path.c index 918638ff80..1b7e0c547a 100644 --- a/src/path/path.c +++ b/src/path/path.c @@ -167,7 +167,7 @@ static int parse_argv(int argc, char *argv[]) { return 1; } -int main(int argc, char* argv[]) { +static int run(int argc, char* argv[]) { int r; log_parse_environment(); @@ -175,7 +175,7 @@ int main(int argc, char* argv[]) { r = parse_argv(argc, argv); if (r <= 0) - goto finish; + return r; if (argc > optind) { int i, q; @@ -185,9 +185,10 @@ int main(int argc, char* argv[]) { if (q < 0) r = q; } - } else - r = list_homes(); -finish: - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return r; + } else + return list_homes(); } + +DEFINE_MAIN_FUNCTION(run); diff --git a/src/portable/portabled.c b/src/portable/portabled.c index 53faa09bac..a853257bc0 100644 --- a/src/portable/portabled.c +++ b/src/portable/portabled.c @@ -122,7 +122,7 @@ static int manager_run(Manager *m) { check_idle, m); } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { _cleanup_(manager_unrefp) Manager *m = NULL; int r; @@ -134,35 +134,31 @@ int main(int argc, char *argv[]) { if (argc != 1) { log_error("This program takes no arguments."); - r = -EINVAL; - goto finish; + return -EINVAL; } assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, SIGTERM, SIGINT, -1) >= 0); r = manager_new(&m); - if (r < 0) { - log_error_errno(r, "Failed to allocate manager object: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to allocate manager object: %m"); r = manager_startup(m); - if (r < 0) { - log_error_errno(r, "Failed to fully start up daemon: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to fully start up daemon: %m"); log_debug("systemd-portabled running as pid " PID_FMT, getpid_cached()); - sd_notify(false, "READY=1\n" "STATUS=Processing requests..."); r = manager_run(m); + (void) sd_notify(false, + "STOPPING=1\n" + "STATUS=Shutting down..."); log_debug("systemd-portabled stopped as pid " PID_FMT, getpid_cached()); - -finish: - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; - + return r; } + +DEFINE_MAIN_FUNCTION(run); diff --git a/src/quotacheck/quotacheck.c b/src/quotacheck/quotacheck.c index d891f18b65..e3c50c366a 100644 --- a/src/quotacheck/quotacheck.c +++ b/src/quotacheck/quotacheck.c @@ -52,18 +52,18 @@ static void test_files(void) { #endif } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { int r; - if (argc > 1) { - log_error("This program takes no arguments."); - return EXIT_FAILURE; - } - log_set_target(LOG_TARGET_AUTO); log_parse_environment(); log_open(); + if (argc > 1) { + log_error("This program takes no arguments."); + return -EINVAL; + } + umask(0022); r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, 0); @@ -74,15 +74,15 @@ int main(int argc, char *argv[]) { if (!arg_force) { if (arg_skip) - return EXIT_SUCCESS; + return 0; if (access("/run/systemd/quotacheck", F_OK) < 0) - return EXIT_SUCCESS; + return 0; } r = safe_fork("(quotacheck)", FORK_RESET_SIGNALS|FORK_DEATHSIG|FORK_LOG|FORK_WAIT, NULL); if (r < 0) - goto finish; + return r; if (r == 0) { static const char * const cmdline[] = { QUOTACHECK, @@ -96,6 +96,7 @@ int main(int argc, char *argv[]) { _exit(EXIT_FAILURE); /* Operational error */ } -finish: - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return 0; } + +DEFINE_MAIN_FUNCTION(run); diff --git a/src/random-seed/random-seed.c b/src/random-seed/random-seed.c index f634625665..f5a7eca93c 100644 --- a/src/random-seed/random-seed.c +++ b/src/random-seed/random-seed.c @@ -19,7 +19,7 @@ #define POOL_SIZE_MIN 512 #define POOL_SIZE_MAX (10*1024*1024) -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { _cleanup_close_ int seed_fd = -1, random_fd = -1; bool read_seed_file, write_seed_file; _cleanup_free_ void* buf = NULL; @@ -29,15 +29,15 @@ int main(int argc, char *argv[]) { FILE *f; int r; - if (argc != 2) { - log_error("This program requires one argument."); - return EXIT_FAILURE; - } - log_set_target(LOG_TARGET_AUTO); log_parse_environment(); log_open(); + if (argc != 2) { + log_error("This program requires one argument."); + return -EINVAL; + } + umask(0022); /* Read pool size, if possible */ @@ -54,10 +54,8 @@ int main(int argc, char *argv[]) { buf_size = POOL_SIZE_MIN; r = mkdir_parents_label(RANDOM_SEED, 0755); - if (r < 0) { - log_error_errno(r, "Failed to create directory " RANDOM_SEED_DIR ": %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to create directory " RANDOM_SEED_DIR ": %m"); /* When we load the seed we read it and write it to the device and then immediately update the saved seed with * new data, to make sure the next boot gets seeded differently. */ @@ -78,10 +76,7 @@ int main(int argc, char *argv[]) { open_rw_error, "Failed to open " RANDOM_SEED " for writing: %m"); r = log_full_errno(missing ? LOG_DEBUG : LOG_ERR, errno, "Failed to open " RANDOM_SEED " for reading: %m"); - if (missing) - r = 0; - - goto finish; + return missing ? 0 : r; } } else write_seed_file = true; @@ -91,10 +86,8 @@ int main(int argc, char *argv[]) { write_seed_file = false; random_fd = open("/dev/urandom", O_WRONLY|O_CLOEXEC|O_NOCTTY, 0600); - if (random_fd < 0) { - r = log_error_errno(errno, "Failed to open /dev/urandom: %m"); - goto finish; - } + if (random_fd < 0) + return log_error_errno(errno, "Failed to open /dev/urandom: %m"); } read_seed_file = true; @@ -102,40 +95,31 @@ int main(int argc, char *argv[]) { } else if (streq(argv[1], "save")) { random_fd = open("/dev/urandom", O_RDONLY|O_CLOEXEC|O_NOCTTY); - if (random_fd < 0) { - r = log_error_errno(errno, "Failed to open /dev/urandom: %m"); - goto finish; - } + if (random_fd < 0) + return log_error_errno(errno, "Failed to open /dev/urandom: %m"); seed_fd = open(RANDOM_SEED, O_WRONLY|O_CLOEXEC|O_NOCTTY|O_CREAT, 0600); - if (seed_fd < 0) { - r = log_error_errno(errno, "Failed to open " RANDOM_SEED ": %m"); - goto finish; - } + if (seed_fd < 0) + return log_error_errno(errno, "Failed to open " RANDOM_SEED ": %m"); read_seed_file = false; write_seed_file = true; } else { log_error("Unknown verb '%s'.", argv[1]); - r = -EINVAL; - goto finish; + return -EINVAL; } - if (fstat(seed_fd, &st) < 0) { - r = log_error_errno(errno, "Failed to stat() seed file " RANDOM_SEED ": %m"); - goto finish; - } + if (fstat(seed_fd, &st) < 0) + return log_error_errno(errno, "Failed to stat() seed file " RANDOM_SEED ": %m"); /* If the seed file is larger than what we expect, then honour the existing size and save/restore as much as it says */ if ((uint64_t) st.st_size > buf_size) buf_size = MIN(st.st_size, POOL_SIZE_MAX); buf = malloc(buf_size); - if (!buf) { - r = log_oom(); - goto finish; - } + if (!buf) + return log_oom(); if (read_seed_file) { sd_id128_t mid; @@ -172,7 +156,6 @@ int main(int argc, char *argv[]) { } if (write_seed_file) { - /* This is just a safety measure. Given that we are root and * most likely created the file ourselves the mode and owner * should be correct anyway. */ @@ -180,21 +163,19 @@ int main(int argc, char *argv[]) { (void) fchown(seed_fd, 0, 0); k = loop_read(random_fd, buf, buf_size, false); - if (k < 0) { - r = log_error_errno(k, "Failed to read new seed from /dev/urandom: %m"); - goto finish; - } + if (k < 0) + return log_error_errno(k, "Failed to read new seed from /dev/urandom: %m"); if (k == 0) { log_error("Got EOF while reading from /dev/urandom."); - r = -EIO; - goto finish; + return -EIO; } r = loop_write(seed_fd, buf, (size_t) k, false); if (r < 0) - log_error_errno(r, "Failed to write new random seed file: %m"); + return log_error_errno(r, "Failed to write new random seed file: %m"); } -finish: - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return r; } + +DEFINE_MAIN_FUNCTION(run); diff --git a/src/remount-fs/remount-fs.c b/src/remount-fs/remount-fs.c index 9220a00215..9a0c39e16f 100644 --- a/src/remount-fs/remount-fs.c +++ b/src/remount-fs/remount-fs.c @@ -22,44 +22,39 @@ * options that are in /etc/fstab that systemd might not have * respected */ -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { _cleanup_hashmap_free_free_ Hashmap *pids = NULL; _cleanup_endmntent_ FILE *f = NULL; struct mntent* me; int r; - if (argc > 1) { - log_error("This program takes no argument."); - return EXIT_FAILURE; - } - log_set_target(LOG_TARGET_AUTO); log_parse_environment(); log_open(); + if (argc > 1) { + log_error("This program takes no arguments."); + return -EINVAL; + } + umask(0022); f = setmntent("/etc/fstab", "re"); if (!f) { - if (errno == ENOENT) { - r = 0; - goto finish; - } + if (errno == ENOENT) + return 0; - r = log_error_errno(errno, "Failed to open /etc/fstab: %m"); - goto finish; + return log_error_errno(errno, "Failed to open /etc/fstab: %m"); } pids = hashmap_new(NULL); - if (!pids) { - r = log_oom(); - goto finish; - } + if (!pids) + return log_oom(); while ((me = getmntent(f))) { + _cleanup_free_ char *s = NULL; pid_t pid; int k; - char *s; /* Remount the root fs, /usr and all API VFS */ if (!mount_point_is_api(me->mnt_dir) && @@ -71,7 +66,7 @@ int main(int argc, char *argv[]) { r = safe_fork("(remount)", FORK_RESET_SIGNALS|FORK_DEATHSIG|FORK_LOG, &pid); if (r < 0) - goto finish; + return r; if (r == 0) { /* Child */ @@ -84,48 +79,40 @@ int main(int argc, char *argv[]) { /* Parent */ s = strdup(me->mnt_dir); - if (!s) { - r = log_oom(); - goto finish; - } + if (!s) + return log_oom(); k = hashmap_put(pids, PID_TO_PTR(pid), s); - if (k < 0) { - free(s); - r = log_oom(); - goto finish; - } + if (k < 0) + return log_oom(); + TAKE_PTR(s); } r = 0; while (!hashmap_isempty(pids)) { siginfo_t si = {}; - char *s; + _cleanup_free_ char *s = NULL; if (waitid(P_ALL, 0, &si, WEXITED) < 0) { - if (errno == EINTR) continue; - r = log_error_errno(errno, "waitid() failed: %m"); - goto finish; + return log_error_errno(errno, "waitid() failed: %m"); } s = hashmap_remove(pids, PID_TO_PTR(si.si_pid)); - if (s) { - if (!is_clean_exit(si.si_code, si.si_status, EXIT_CLEAN_COMMAND, NULL)) { - if (si.si_code == CLD_EXITED) - log_error(MOUNT_PATH " for %s exited with exit status %i.", s, si.si_status); - else - log_error(MOUNT_PATH " for %s terminated by signal %s.", s, signal_to_string(si.si_status)); - - r = -ENOEXEC; - } - - free(s); + if (s && + !is_clean_exit(si.si_code, si.si_status, EXIT_CLEAN_COMMAND, NULL)) { + if (si.si_code == CLD_EXITED) + log_error(MOUNT_PATH " for %s exited with exit status %i.", s, si.si_status); + else + log_error(MOUNT_PATH " for %s terminated by signal %s.", s, signal_to_string(si.si_status)); + + r = -ENOEXEC; } } -finish: - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return r; } + +DEFINE_MAIN_FUNCTION(run); diff --git a/src/sleep/sleep.c b/src/sleep/sleep.c index 198d45c902..6010611366 100644 --- a/src/sleep/sleep.c +++ b/src/sleep/sleep.c @@ -351,7 +351,7 @@ static int parse_argv(int argc, char *argv[]) { return 1 /* work to do */; } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { bool allow; _cleanup_strv_free_ char **modes = NULL, **states = NULL; usec_t delay = 0; @@ -363,22 +363,21 @@ int main(int argc, char *argv[]) { r = parse_argv(argc, argv); if (r <= 0) - goto finish; + return r; r = parse_sleep_config(arg_verb, &allow, &modes, &states, &delay); if (r < 0) - goto finish; + return r; if (!allow) { log_error("Sleep mode \"%s\" is disabled by configuration, refusing.", arg_verb); - return EXIT_FAILURE; + return -EACCES; } if (streq(arg_verb, "suspend-then-hibernate")) - r = execute_s2h(delay); + return execute_s2h(delay); else - r = execute(modes, states); - -finish: - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return execute(modes, states); } + +DEFINE_MAIN_FUNCTION(run); diff --git a/src/stdio-bridge/stdio-bridge.c b/src/stdio-bridge/stdio-bridge.c index 0034ec8878..9efd6c216f 100644 --- a/src/stdio-bridge/stdio-bridge.c +++ b/src/stdio-bridge/stdio-bridge.c @@ -89,7 +89,7 @@ static int parse_argv(int argc, char *argv[]) { return 1; } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { _cleanup_(sd_bus_unrefp) sd_bus *a = NULL, *b = NULL; sd_id128_t server_id; bool is_unix; @@ -101,7 +101,7 @@ int main(int argc, char *argv[]) { r = parse_argv(argc, argv); if (r <= 0) - goto finish; + return r; r = sd_listen_fds(0); if (r == 0) { @@ -112,7 +112,7 @@ int main(int argc, char *argv[]) { out_fd = SD_LISTEN_FDS_START; } else { log_error("Illegal number of file descriptors passed."); - goto finish; + return -EINVAL; } is_unix = @@ -120,73 +120,51 @@ int main(int argc, char *argv[]) { sd_is_socket(out_fd, AF_UNIX, 0, 0) > 0; r = sd_bus_new(&a); - if (r < 0) { - log_error_errno(r, "Failed to allocate bus: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to allocate bus: %m"); if (arg_transport == BUS_TRANSPORT_MACHINE) r = bus_set_address_system_machine(a, arg_bus_path); else r = sd_bus_set_address(a, arg_bus_path); - if (r < 0) { - log_error_errno(r, "Failed to set address to connect to: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to set address to connect to: %m"); r = sd_bus_negotiate_fds(a, is_unix); - if (r < 0) { - log_error_errno(r, "Failed to set FD negotiation: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to set FD negotiation: %m"); r = sd_bus_start(a); - if (r < 0) { - log_error_errno(r, "Failed to start bus client: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to start bus client: %m"); r = sd_bus_get_bus_id(a, &server_id); - if (r < 0) { - log_error_errno(r, "Failed to get server ID: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to get server ID: %m"); r = sd_bus_new(&b); - if (r < 0) { - log_error_errno(r, "Failed to allocate bus: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to allocate bus: %m"); r = sd_bus_set_fd(b, in_fd, out_fd); - if (r < 0) { - log_error_errno(r, "Failed to set fds: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to set fds: %m"); r = sd_bus_set_server(b, 1, server_id); - if (r < 0) { - log_error_errno(r, "Failed to set server mode: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to set server mode: %m"); r = sd_bus_negotiate_fds(b, is_unix); - if (r < 0) { - log_error_errno(r, "Failed to set FD negotiation: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to set FD negotiation: %m"); r = sd_bus_set_anonymous(b, true); - if (r < 0) { - log_error_errno(r, "Failed to set anonymous authentication: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to set anonymous authentication: %m"); r = sd_bus_start(b); - if (r < 0) { - log_error_errno(r, "Failed to start bus client: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to start bus client: %m"); for (;;) { _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL; @@ -195,74 +173,51 @@ int main(int argc, char *argv[]) { struct timespec _ts, *ts; r = sd_bus_process(a, &m); - if (r < 0) { - log_error_errno(r, "Failed to process bus a: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to process bus a: %m"); if (m) { r = sd_bus_send(b, m, NULL); - if (r < 0) { - log_error_errno(r, "Failed to send message: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to send message: %m"); } if (r > 0) continue; r = sd_bus_process(b, &m); - if (r < 0) { + if (r < 0) /* treat 'connection reset by peer' as clean exit condition */ - if (r == -ECONNRESET) - r = 0; - - goto finish; - } + return r == -ECONNRESET ? 0 : r; if (m) { r = sd_bus_send(a, m, NULL); - if (r < 0) { - log_error_errno(r, "Failed to send message: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to send message: %m"); } if (r > 0) continue; fd = sd_bus_get_fd(a); - if (fd < 0) { - r = fd; - log_error_errno(r, "Failed to get fd: %m"); - goto finish; - } + if (fd < 0) + return log_error_errno(fd, "Failed to get fd: %m"); events_a = sd_bus_get_events(a); - if (events_a < 0) { - r = events_a; - log_error_errno(r, "Failed to get events mask: %m"); - goto finish; - } + if (events_a < 0) + return log_error_errno(events_a, "Failed to get events mask: %m"); r = sd_bus_get_timeout(a, &timeout_a); - if (r < 0) { - log_error_errno(r, "Failed to get timeout: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to get timeout: %m"); events_b = sd_bus_get_events(b); - if (events_b < 0) { - r = events_b; - log_error_errno(r, "Failed to get events mask: %m"); - goto finish; - } + if (events_b < 0) + return log_error_errno(events_b, "Failed to get events mask: %m"); r = sd_bus_get_timeout(b, &timeout_b); - if (r < 0) { - log_error_errno(r, "Failed to get timeout: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to get timeout: %m"); t = timeout_a; if (t == (uint64_t) -1 || (timeout_b != (uint64_t) -1 && timeout_b < timeout_a)) @@ -290,12 +245,11 @@ int main(int argc, char *argv[]) { r = ppoll(p, ELEMENTSOF(p), ts, NULL); } - if (r < 0) { - log_error_errno(errno, "ppoll() failed: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(errno, "ppoll() failed: %m"); } -finish: - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return 0; } + +DEFINE_MAIN_FUNCTION(run); diff --git a/src/sysv-generator/sysv-generator.c b/src/sysv-generator/sysv-generator.c index cffaae1286..255adeaa19 100644 --- a/src/sysv-generator/sysv-generator.c +++ b/src/sysv-generator/sysv-generator.c @@ -916,47 +916,43 @@ finish: return r; } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { _cleanup_(free_sysvstub_hashmapp) Hashmap *all_services = NULL; _cleanup_(lookup_paths_free) LookupPaths lp = {}; SysvStub *service; Iterator j; int r; + log_set_prohibit_ipc(true); + log_set_target(LOG_TARGET_AUTO); + log_parse_environment(); + log_open(); + if (argc > 1 && argc != 4) { log_error("This program takes three or no arguments."); - return EXIT_FAILURE; + return -EINVAL; } if (argc > 1) arg_dest = argv[3]; - log_set_prohibit_ipc(true); - log_set_target(LOG_TARGET_AUTO); - log_parse_environment(); - log_open(); - umask(0022); r = lookup_paths_init(&lp, UNIT_FILE_SYSTEM, LOOKUP_PATHS_EXCLUDE_GENERATED, NULL); - if (r < 0) { - log_error_errno(r, "Failed to find lookup paths: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to find lookup paths: %m"); all_services = hashmap_new(&string_hash_ops); - if (!all_services) { - r = log_oom(); - goto finish; - } + if (!all_services) + return log_oom(); r = enumerate_sysv(&lp, all_services); if (r < 0) - goto finish; + return r; r = set_dependencies_from_rcnd(&lp, all_services); if (r < 0) - goto finish; + return r; HASHMAP_FOREACH(service, all_services, j) (void) load_sysv(service); @@ -966,8 +962,7 @@ int main(int argc, char *argv[]) { (void) generate_unit_file(service); } - r = 0; - -finish: - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return 0; } + +DEFINE_MAIN_FUNCTION(run); diff --git a/src/tty-ask-password-agent/tty-ask-password-agent.c b/src/tty-ask-password-agent/tty-ask-password-agent.c index 1aa90b6040..1c965217d9 100644 --- a/src/tty-ask-password-agent/tty-ask-password-agent.c +++ b/src/tty-ask-password-agent/tty-ask-password-agent.c @@ -836,7 +836,7 @@ static int ask_on_consoles(int argc, char *argv[]) { return 0; } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { int r; log_set_target(LOG_TARGET_AUTO); @@ -847,31 +847,28 @@ int main(int argc, char *argv[]) { r = parse_argv(argc, argv); if (r <= 0) - goto finish; + return r; if (arg_console && !arg_device) /* - * Spawn for each console device a separate process. + * Spawn a separate process for each console device. */ - r = ask_on_consoles(argc, argv); - else { - - if (arg_device) { - /* - * Later on, a controlling terminal will be acquired, - * therefore the current process has to become a session - * leader and should not have a controlling terminal already. - */ - (void) setsid(); - (void) release_terminal(); - } + return ask_on_consoles(argc, argv); - if (IN_SET(arg_action, ACTION_WATCH, ACTION_WALL)) - r = watch_passwords(); - else - r = show_passwords(); + if (arg_device) { + /* + * Later on, a controlling terminal will be acquired, + * therefore the current process has to become a session + * leader and should not have a controlling terminal already. + */ + (void) setsid(); + (void) release_terminal(); } -finish: - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + if (IN_SET(arg_action, ACTION_WATCH, ACTION_WALL)) + return watch_passwords(); + else + return show_passwords(); } + +DEFINE_MAIN_FUNCTION(run); diff --git a/src/volatile-root/volatile-root.c b/src/volatile-root/volatile-root.c index bc786c9734..ab7dca37b1 100644 --- a/src/volatile-root/volatile-root.c +++ b/src/volatile-root/volatile-root.c @@ -76,7 +76,7 @@ finish_rmdir: return r; } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { VolatileMode m = _VOLATILE_MODE_INVALID; const char *path; int r; @@ -87,22 +87,18 @@ int main(int argc, char *argv[]) { if (argc > 3) { log_error("Too many arguments. Expected directory and mode."); - r = -EINVAL; - goto finish; + return -EINVAL; } r = query_volatile_mode(&m); - if (r < 0) { - log_error_errno(r, "Failed to determine volatile mode from kernel command line."); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to determine volatile mode from kernel command line."); if (r == 0 && argc >= 2) { /* The kernel command line always wins. However if nothing was set there, the argument passed here wins instead. */ m = volatile_mode_from_string(argv[1]); if (m < 0) { log_error("Couldn't parse volatile mode: %s", argv[1]); r = -EINVAL; - goto finish; } } @@ -113,28 +109,22 @@ int main(int argc, char *argv[]) { if (isempty(path)) { log_error("Directory name cannot be empty."); - r = -EINVAL; - goto finish; + return -EINVAL; } if (!path_is_absolute(path)) { log_error("Directory must be specified as absolute path."); - r = -EINVAL; - goto finish; + return -EINVAL; } if (path_equal(path, "/")) { log_error("Directory cannot be the root directory."); - r = -EINVAL; - goto finish; + return -EINVAL; } } - if (m != VOLATILE_YES) { - r = 0; - goto finish; - } - - r = make_volatile(path); + if (m != VOLATILE_YES) + return 0; -finish: - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return make_volatile(path); } + +DEFINE_MAIN_FUNCTION(run); |