diff options
author | Tavian Barnes <tavianator@tavianator.com> | 2025-02-04 13:45:45 -0500 |
---|---|---|
committer | Tavian Barnes <tavianator@tavianator.com> | 2025-02-06 10:38:44 -0500 |
commit | f8aca1c316b116c2de11d42010fdda0ddb418750 (patch) | |
tree | c75e31e1f895c92721fa31be2c559335b21de714 /src | |
parent | 532dec0849dcdc3e15e530ac40a8168f146a41cd (diff) | |
download | bfs-f8aca1c316b116c2de11d42010fdda0ddb418750.tar.xz |
diag: Try to make diagnostics signal-safer
Link: https://sourceware.org/bugzilla/show_bug.cgi?id=16060
Diffstat (limited to 'src')
-rw-r--r-- | src/diag.c | 19 |
1 files changed, 16 insertions, 3 deletions
@@ -14,13 +14,26 @@ #include <stdarg.h> #include <stdio.h> #include <stdlib.h> +#include <unistd.h> + +/** + * Print an error using dprintf() if possible, because it's more likely to be + * async-signal-safe in practice. + */ +#if BFS_HAS_DPRINTF +# define eprintf(...) dprintf(STDERR_FILENO, __VA_ARGS__) +# define veprintf(...) vdprintf(STDERR_FILENO, __VA_ARGS__) +#else +# define eprintf(...) fprintf(stderr, __VA_ARGS__) +# define veprintf(...) vfprintf(stderr, __VA_ARGS__) +#endif /** bfs_diagf() implementation. */ _printf(2, 0) static void bfs_vdiagf(const struct bfs_loc *loc, const char *format, va_list args) { - fprintf(stderr, "%s: %s@%s:%d: ", xgetprogname(), loc->func, loc->file, loc->line); - vfprintf(stderr, format, args); - fprintf(stderr, "\n"); + eprintf("%s: %s@%s:%d: ", xgetprogname(), loc->func, loc->file, loc->line); + veprintf(format, args); + eprintf("\n"); } void bfs_diagf(const struct bfs_loc *loc, const char *format, ...) { |