From: Karel Zak Date: Tue, 24 Jan 2023 16:05:25 +0000 (+0100) Subject: include/c: add functions to print from signal handlers X-Git-Tag: v2.39-rc1~122 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=32457b5efa5d4541a7d01bed9686a4f51952cd5b;p=thirdparty%2Futil-linux.git include/c: add functions to print from signal handlers Addresses: https://github.com/util-linux/util-linux/pull/2019 Signed-off-by: Karel Zak --- diff --git a/include/c.h b/include/c.h index 4cb248f7f2..7e8177ac01 100644 --- a/include/c.h +++ b/include/c.h @@ -407,6 +407,29 @@ static inline int xusleep(useconds_t usec) #endif } + +#define ul_err_write(_m) ignore_result( write(STDERR_FILENO, _m, strlen(_m)) ) + +/* + * warn() for signal handlers + */ +static inline void ul_sig_warn(const char *mesg) +{ + ul_err_write(program_invocation_short_name); + ul_err_write(": "); + ul_err_write(mesg); + ul_err_write("\n"); +} + +/* + * err() for signal handlers + */ +static inline void __attribute__((__noreturn__)) ul_sig_err(int excode, const char *mesg) +{ + ul_sig_warn(mesg); + _exit(excode); +} + /* * Constant strings for usage() functions. For more info see * Documentation/{howto-usage-function.txt,boilerplate.c} diff --git a/lib/pager.c b/lib/pager.c index 8f62310c07..2421703669 100644 --- a/lib/pager.c +++ b/lib/pager.c @@ -114,9 +114,7 @@ static int wait_or_whine(pid_t pid) if (waiting < 0) { if (errno == EINTR) continue; - /* Can't err() on signal handler */ - ignore_result(write(STDERR_FILENO, "waitpid failed", 14)); - _exit(EXIT_FAILURE); + ul_sig_err(EXIT_FAILURE, "waitpid failed"); } if (waiting != pid) return -1; diff --git a/login-utils/last.c b/login-utils/last.c index 2b24f08a05..260a9f35e8 100644 --- a/login-utils/last.c +++ b/login-utils/last.c @@ -271,9 +271,7 @@ static int uread(FILE *fp, struct utmpx *u, int *quit, const char *filename) */ static void int_handler(int sig __attribute__((unused))) { - /* can't use err on signal handler */ - write(STDERR_FILENO, "Interrupted\n", sizeof("Interrupted\n")-1); - _exit(EXIT_FAILURE); + ul_sig_err(EXIT_FAILURE, "Interrupted"); } /* @@ -281,7 +279,7 @@ static void int_handler(int sig __attribute__((unused))) */ static void quit_handler(int sig __attribute__((unused))) { - write(STDERR_FILENO, "Interrupted\n", sizeof("Interrupted\n")-1); + ul_sig_warn("Interrupted"); signal(SIGQUIT, quit_handler); } #endif