summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ac-power/ac-power.c15
-rw-r--r--src/basic/macro.h19
-rw-r--r--src/boot/boot-check-no-failures.c23
-rw-r--r--src/cgtop/cgtop.c45
-rw-r--r--src/coredump/coredump.c24
-rw-r--r--src/detect-virt/detect-virt.c48
-rw-r--r--src/escape/escape.c88
-rw-r--r--src/fsck/fsck.c96
-rw-r--r--src/hostname/hostnamectl.c17
-rw-r--r--src/hwdb/hwdb.c11
-rw-r--r--src/id128/id128.c11
-rw-r--r--src/import/export.c12
-rw-r--r--src/import/import.c12
-rw-r--r--src/import/importd.c24
-rw-r--r--src/import/pull.c12
-rw-r--r--src/journal/cat.c25
-rw-r--r--src/login/inhibit.c33
-rw-r--r--src/login/logind.c30
-rw-r--r--src/login/user-runtime-dir.c25
-rw-r--r--src/machine/machined.c24
-rw-r--r--src/notify/notify.c65
-rw-r--r--src/partition/makefs.c33
-rw-r--r--src/path/path.c13
-rw-r--r--src/portable/portabled.c28
-rw-r--r--src/quotacheck/quotacheck.c23
-rw-r--r--src/random-seed/random-seed.c73
-rw-r--r--src/remount-fs/remount-fs.c75
-rw-r--r--src/sleep/sleep.c17
-rw-r--r--src/stdio-bridge/stdio-bridge.c142
-rw-r--r--src/sysv-generator/sysv-generator.c37
-rw-r--r--src/tty-ask-password-agent/tty-ask-password-agent.c39
-rw-r--r--src/volatile-root/volatile-root.c34
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);