#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}
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;
*/
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");
}
/*
*/
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