return 0;
}
-static int sigaction_many_ap(const struct sigaction *sa, int sig, va_list ap) {
- int r = 0;
+int sigaction_many_internal(const struct sigaction *sa, ...) {
+ int sig, r = 0;
+ va_list ap;
+
+ va_start(ap, sa);
/* negative signal ends the list. 0 signal is skipped. */
- for (; sig >= 0; sig = va_arg(ap, int)) {
+ while ((sig = va_arg(ap, int)) >= 0) {
if (sig == 0)
continue;
}
}
- return r;
-}
-
-int sigaction_many(const struct sigaction *sa, ...) {
- va_list ap;
- int r;
-
- va_start(ap, sa);
- r = sigaction_many_ap(sa, 0, ap);
- va_end(ap);
-
- return r;
-}
-
-int ignore_signals(int sig, ...) {
-
- static const struct sigaction sa = {
- .sa_handler = SIG_IGN,
- .sa_flags = SA_RESTART,
- };
-
- va_list ap;
- int r;
-
- va_start(ap, sig);
- r = sigaction_many_ap(&sa, sig, ap);
- va_end(ap);
-
- return r;
-}
-
-int default_signals(int sig, ...) {
-
- static const struct sigaction sa = {
- .sa_handler = SIG_DFL,
- .sa_flags = SA_RESTART,
- };
-
- va_list ap;
- int r;
-
- va_start(ap, sig);
- r = sigaction_many_ap(&sa, sig, ap);
va_end(ap);
return r;
int reset_all_signal_handlers(void);
int reset_signal_mask(void);
-int ignore_signals(int sig, ...);
-int default_signals(int sig, ...);
-int sigaction_many(const struct sigaction *sa, ...);
+int sigaction_many_internal(const struct sigaction *sa, ...);
+
+#define ignore_signals(...) \
+ sigaction_many_internal( \
+ &(const struct sigaction) { \
+ .sa_handler = SIG_IGN, \
+ .sa_flags = SA_RESTART \
+ }, \
+ __VA_ARGS__, \
+ -1)
+
+#define default_signals(...) \
+ sigaction_many_internal( \
+ &(const struct sigaction) { \
+ .sa_handler = SIG_DFL, \
+ .sa_flags = SA_RESTART \
+ }, \
+ __VA_ARGS__, \
+ -1)
+
+#define sigaction_many(sa, ...) \
+ sigaction_many_internal(sa, __VA_ARGS__, -1)
int sigset_add_many(sigset_t *ss, ...);
int sigprocmask_many(int how, sigset_t *old, ...);
if (setresuid(uid, uid, uid) < 0)
log_warning_errno(errno, "Failed to setresuid() in sd-pam: %m");
- (void) ignore_signals(SIGPIPE, -1);
+ (void) ignore_signals(SIGPIPE);
/* Wait until our parent died. This will only work if
* the above setresuid() succeeds, otherwise the kernel
rename_process_from_path(command->path);
- /* We reset exactly these signals, since they are the
- * only ones we set to SIG_IGN in the main daemon. All
- * others we leave untouched because we set them to
- * SIG_DFL or a valid handler initially, both of which
- * will be demoted to SIG_DFL. */
+ /* We reset exactly these signals, since they are the only ones we set to SIG_IGN in the main
+ * daemon. All others we leave untouched because we set them to SIG_DFL or a valid handler initially,
+ * both of which will be demoted to SIG_DFL. */
(void) default_signals(SIGNALS_CRASH_HANDLER,
- SIGNALS_IGNORE, -1);
+ SIGNALS_IGNORE);
if (context->ignore_sigpipe)
- (void) ignore_signals(SIGPIPE, -1);
+ (void) ignore_signals(SIGPIPE);
r = reset_signal_mask();
if (r < 0) {
};
int r;
- /* We ignore the return value here, since, we don't mind if we
- * cannot set up a crash handler */
- r = sigaction_many(&sa, SIGNALS_CRASH_HANDLER, -1);
+ /* We ignore the return value here, since, we don't mind if we cannot set up a crash handler */
+ r = sigaction_many(&sa, SIGNALS_CRASH_HANDLER);
if (r < 0)
log_debug_errno(r, "I had trouble setting up the crash handler, ignoring: %m");
}
/* Reset all signal handlers. */
(void) reset_all_signal_handlers();
- (void) ignore_signals(SIGNALS_IGNORE, -1);
+ (void) ignore_signals(SIGNALS_IGNORE);
(void) parse_configuration(&saved_rlimit_nofile, &saved_rlimit_memlock);
if (r != 0)
return r;
- (void) default_signals(SIGNALS_CRASH_HANDLER, SIGNALS_IGNORE, -1);
- (void) ignore_signals(SIGPIPE, -1);
+ (void) default_signals(SIGNALS_CRASH_HANDLER, SIGNALS_IGNORE);
+ (void) ignore_signals(SIGPIPE);
(void) prctl(PR_SET_PDEATHSIG, SIGTERM);
return log_oom();
/* Don't interfere with gdb and its handling of SIGINT. */
- (void) ignore_signals(SIGINT, -1);
+ (void) ignore_signals(SIGINT);
fork_name = strjoina("(", debugger_call[0], ")");
r = wait_for_terminate_and_check(debugger_call[0], pid, WAIT_LOG_ABNORMAL);
finish:
- (void) default_signals(SIGINT, -1);
+ (void) default_signals(SIGINT);
if (unlink_path) {
log_debug("Removed temporary file %s", path);
if (r <= 0)
return r;
- (void) ignore_signals(SIGPIPE, -1);
+ (void) ignore_signals(SIGPIPE);
return export_main(argc, argv);
}
if (r <= 0)
return 0;
- (void) ignore_signals(SIGPIPE, -1);
+ (void) ignore_signals(SIGPIPE);
return import_main(argc, argv);
}
if (r <= 0)
return r;
- (void) ignore_signals(SIGPIPE, -1);
+ (void) ignore_signals(SIGPIPE);
return pull_main(argc, argv);
}
pid_t pid;
/* Ignore SIGINT and allow the forked process to receive it */
- (void) ignore_signals(SIGINT, -1);
+ (void) ignore_signals(SIGINT);
if (!arg_who) {
w = strv_join(argv + optind, " ");
"Not enough real-time signals available: %u-%u",
SIGRTMIN, SIGRTMAX);
- assert_se(ignore_signals(SIGRTMIN + 1, -1) >= 0);
+ assert_se(ignore_signals(SIGRTMIN + 1) >= 0);
assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGRTMIN, -1) >= 0);
r = sd_event_add_signal(m->event, NULL, SIGRTMIN, manager_vt_switch, m);
assert_se(sigprocmask(SIG_BLOCK, &mask_chld, NULL) >= 0);
/* Reset signal to default */
- r = default_signals(SIGCHLD, -1);
+ r = default_signals(SIGCHLD);
if (r < 0)
return log_error_errno(r, "Failed to reset SIGCHLD: %m");
/* Ignore SIGPIPE here, because we use splice() on the ptyfwd stuff and that will generate SIGPIPE if
* the result is closed. Note that the container payload child will reset signal mask+handler anyway,
* so just turning this off here means we only turn it off in nspawn itself, not any children. */
- (void) ignore_signals(SIGPIPE, -1);
+ (void) ignore_signals(SIGPIPE);
n_fd_passed = sd_listen_fds(false);
if (n_fd_passed > 0) {
if (r < 0)
return r;
if (r > 0)
- (void) ignore_signals(SIGINT, -1);
+ (void) ignore_signals(SIGINT);
return 1;
}
/* If we are slow to exit after the root switch, the new systemd instance will send us a signal to
* terminate. Just ignore it and exit normally. This way the unit does not end up as failed. */
- r = ignore_signals(SIGTERM, -1);
+ r = ignore_signals(SIGTERM);
if (r < 0)
log_warning_errno(r, "Failed to change disposition of SIGTERM to ignore: %m");
r = bus_call_method(bus, bus_systemd_mgr, "SwitchRoot", &error, NULL, "ss", root, init);
if (r < 0) {
- (void) default_signals(SIGTERM, -1);
+ (void) default_signals(SIGTERM);
return log_error_errno(r, "Failed to switch root: %s", bus_error_message(&error, r));
}
}
static void test_ignore_signals(void) {
- assert_se(ignore_signals(SIGINT, -1) >= 0);
+ assert_se(ignore_signals(SIGINT) >= 0);
assert_se(kill(getpid_cached(), SIGINT) >= 0);
- assert_se(ignore_signals(SIGUSR1, SIGUSR2, SIGTERM, SIGPIPE, -1) >= 0);
+ assert_se(ignore_signals(SIGUSR1, SIGUSR2, SIGTERM, SIGPIPE) >= 0);
assert_se(kill(getpid_cached(), SIGUSR1) >= 0);
assert_se(kill(getpid_cached(), SIGUSR2) >= 0);
assert_se(kill(getpid_cached(), SIGTERM) >= 0);
assert_se(kill(getpid_cached(), SIGPIPE) >= 0);
- assert_se(default_signals(SIGINT, SIGUSR1, SIGUSR2, SIGTERM, SIGPIPE, -1) >= 0);
+ assert_se(default_signals(SIGINT, SIGUSR1, SIGUSR2, SIGTERM, SIGPIPE) >= 0);
}
int main(int argc, char *argv[]) {