diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index d3ec22e224..073dc1426c 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -2726,19 +2726,12 @@ static int run(int argc, char *argv[]) { return r; sig = r; - /* unref signal event sources. */ - e = sd_event_unref(e); - r = update_cursor(j); if (r < 0) return r; /* re-send the original signal. */ - assert(SIGNAL_VALID(sig)); - if (raise(sig) < 0) - log_error("Failed to raise the original signal SIG%s, ignoring: %m", signal_to_string(sig)); - - return 0; + return sig; } r = show(&c); @@ -2763,4 +2756,4 @@ static int run(int argc, char *argv[]) { return 0; } -DEFINE_MAIN_FUNCTION(run); +DEFINE_MAIN_FUNCTION_WITH_POSITIVE_SIGNAL(run); diff --git a/src/shared/generator.h b/src/shared/generator.h index a5dc2847d7..e5db1c17ce 100644 --- a/src/shared/generator.h +++ b/src/shared/generator.h @@ -102,4 +102,5 @@ void log_setup_generator(void); impl(argv[1], \ argv[argc == 4 ? 2 : 1], \ argv[argc == 4 ? 3 : 1]), \ + exit_failure_if_negative, \ exit_failure_if_negative) diff --git a/src/shared/main-func.h b/src/shared/main-func.h index b3aff4cee7..d0689b42d9 100644 --- a/src/shared/main-func.h +++ b/src/shared/main-func.h @@ -3,16 +3,22 @@ #include +#if HAVE_VALGRIND_VALGRIND_H +# include +#endif + #include "sd-daemon.h" #include "argv-util.h" +#include "hashmap.h" #include "pager.h" #include "selinux-util.h" +#include "signal-util.h" #include "spawn-ask-password-agent.h" #include "spawn-polkit-agent.h" #include "static-destruct.h" -#define _DEFINE_MAIN_FUNCTION(intro, impl, result_to_exit_status) \ +#define _DEFINE_MAIN_FUNCTION(intro, impl, result_to_exit_status, result_to_return_value) \ int main(int argc, char *argv[]) { \ int r; \ assert_se(argc > 0 && !isempty(argv[0])); \ @@ -28,7 +34,7 @@ pager_close(); \ mac_selinux_finish(); \ static_destruct(); \ - return result_to_exit_status(r); \ + return result_to_return_value(r); \ } static inline int exit_failure_if_negative(int result) { @@ -38,7 +44,7 @@ static inline int exit_failure_if_negative(int result) { /* Negative return values from impl are mapped to EXIT_FAILURE, and * everything else means success! */ #define DEFINE_MAIN_FUNCTION(impl) \ - _DEFINE_MAIN_FUNCTION(,impl(argc, argv), exit_failure_if_negative) + _DEFINE_MAIN_FUNCTION(,impl(argc, argv), exit_failure_if_negative, exit_failure_if_negative) static inline int exit_failure_if_nonzero(int result) { return result < 0 ? EXIT_FAILURE : result; @@ -48,4 +54,28 @@ static inline int exit_failure_if_nonzero(int result) { * and positive values are propagated. * Note: "true" means failure! */ #define DEFINE_MAIN_FUNCTION_WITH_POSITIVE_FAILURE(impl) \ - _DEFINE_MAIN_FUNCTION(,impl(argc, argv), exit_failure_if_nonzero) + _DEFINE_MAIN_FUNCTION(,impl(argc, argv), exit_failure_if_nonzero, exit_failure_if_nonzero) + +static inline int raise_or_exit_status(int ret) { + if (ret < 0) + return EXIT_FAILURE; + if (ret == 0) + return EXIT_SUCCESS; + if (!SIGNAL_VALID(ret)) + return EXIT_FAILURE; + +#if HAVE_VALGRIND_VALGRIND_H + /* If raise() below succeeds, the destructor cleanup_pools() in hashmap.c will never called. */ + if (RUNNING_ON_VALGRIND) + hashmap_trim_pools(); +#endif + + (void) raise(ret); + /* exit with failure if raise() does not immediately abort the program. */ + return EXIT_FAILURE; +} + +/* Negative return values from impl are mapped to EXIT_FAILURE, zero is mapped to EXIT_SUCCESS, + * and raise if a positive signal is returned from impl. */ +#define DEFINE_MAIN_FUNCTION_WITH_POSITIVE_SIGNAL(impl) \ + _DEFINE_MAIN_FUNCTION(,impl(argc, argv), exit_failure_if_negative, raise_or_exit_status)