]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
include/c: add functions to print from signal handlers
authorKarel Zak <kzak@redhat.com>
Tue, 24 Jan 2023 16:05:25 +0000 (17:05 +0100)
committerKarel Zak <kzak@redhat.com>
Tue, 24 Jan 2023 16:05:25 +0000 (17:05 +0100)
Addresses: https://github.com/util-linux/util-linux/pull/2019
Signed-off-by: Karel Zak <kzak@redhat.com>
include/c.h
lib/pager.c
login-utils/last.c

index 4cb248f7f2385682e6cd3f0c527fb13f4e8cebbf..7e8177ac016598964a18688caf2aa8d906404efd 100644 (file)
@@ -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}
index 8f62310c07797d97b7f8ac7598f94c327696fed1..2421703669b32a829c28ced8d37067bf16c17b7c 100644 (file)
@@ -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;
index 2b24f08a059a5da9e083a87cd740c514af72d955..260a9f35e80470af975b21c5b085c31d4fd9157e 100644 (file)
@@ -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