Merge pull request #10811 from keszybz/define-main-through-macro

Define main through macro
This commit is contained in:
Lennart Poettering
2018-11-19 15:28:17 +01:00
committed by GitHub
32 changed files with 473 additions and 702 deletions
+7 -8
View File
@@ -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);
+19
View File
@@ -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"
+9 -14
View File
@@ -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);
+16 -29
View File
@@ -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);
+10 -14
View File
@@ -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);
+17 -31
View File
@@ -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);
+33 -55
View File
@@ -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);
+36 -60
View File
@@ -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);
+7 -10
View File
@@ -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;
}
if (r < 0)
return log_error_errno(r, "Failed to create bus connection: %m");
r = hostnamectl_main(bus, argc, argv);
finish:
return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
return hostnamectl_main(bus, argc, argv);
}
DEFINE_MAIN_FUNCTION(run);
+5 -6
View File
@@ -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);
+5 -6
View File
@@ -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);
+5 -7
View File
@@ -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);
+5 -7
View File
@@ -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);
+10 -14
View File
@@ -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);
+5 -7
View File
@@ -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);
+10 -15
View File
@@ -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);
+12 -21
View File
@@ -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);
+11 -19
View File
@@ -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);
+11 -14
View File
@@ -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);
+9 -15
View File
@@ -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);
+25 -40
View File
@@ -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);
+14 -19
View File
@@ -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);
+7 -6
View File
@@ -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);
+12 -16
View File
@@ -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);
+12 -11
View File
@@ -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);
+27 -46
View File
@@ -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);
+30 -43
View File
@@ -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));
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;
}
free(s);
r = -ENOEXEC;
}
}
finish:
return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
return r;
}
DEFINE_MAIN_FUNCTION(run);
+8 -9
View File
@@ -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);
+48 -94
View File
@@ -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);
+18 -23
View File
@@ -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;
if (argc > 1 && argc != 4) {
log_error("This program takes three or no arguments.");
return EXIT_FAILURE;
}
if (argc > 1)
arg_dest = argv[3];
log_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 -EINVAL;
}
if (argc > 1)
arg_dest = argv[3];
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);
@@ -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 {
return ask_on_consoles(argc, argv);
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();
}
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);
+12 -22
View File
@@ -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;
}
if (m != VOLATILE_YES)
return 0;
r = make_volatile(path);
finish:
return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
return make_volatile(path);
}
DEFINE_MAIN_FUNCTION(run);