summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Crute <mike@crute.us>2023-01-12 17:40:53 +0100
committerOndrej Zajicek <santiago@crfreenet.org>2023-01-12 17:40:53 +0100
commit64a2b7aaa303be0b407508747bfc96c1c656f1e2 (patch)
tree29953b35070a4906ef3f6731a152811236376ddb
parente20bef69ccc4a85ef62359ee539c9db2dbe09127 (diff)
Log message before aborting
Log message before aborting due to watchdog timeout. We have to use async-safe write to debug log, as it is done in signal handler. Minor changes from committer.
-rw-r--r--lib/birdlib.h1
-rw-r--r--sysdep/unix/io.c2
-rw-r--r--sysdep/unix/log.c22
3 files changed, 25 insertions, 0 deletions
diff --git a/lib/birdlib.h b/lib/birdlib.h
index 81d4908a..e03bd0b2 100644
--- a/lib/birdlib.h
+++ b/lib/birdlib.h
@@ -160,6 +160,7 @@ void bug(const char *msg, ...) NORET;
#define L_BUG "\011" /* BIRD bugs */
void debug(const char *msg, ...); /* Printf to debug output */
+void debug_safe(const char *msg); /* Printf to debug output, async-safe */
/* Debugging */
diff --git a/sysdep/unix/io.c b/sysdep/unix/io.c
index 810e782d..e131ca41 100644
--- a/sysdep/unix/io.c
+++ b/sysdep/unix/io.c
@@ -2128,6 +2128,8 @@ watchdog_sigalrm(int sig UNUSED)
config->latency_limit = 0xffffffff;
io_update_time();
+ debug_safe("Watchdog timer timed out\n");
+
/* We want core dump */
abort();
}
diff --git a/sysdep/unix/log.c b/sysdep/unix/log.c
index 4e9df069..53122aee 100644
--- a/sysdep/unix/log.c
+++ b/sysdep/unix/log.c
@@ -31,6 +31,7 @@
#include "lib/lists.h"
#include "sysdep/unix/unix.h"
+static int dbg_fd = -1;
static FILE *dbgf;
static list *current_log_list;
static char *current_syslog_name; /* NULL -> syslog closed */
@@ -324,6 +325,21 @@ debug(const char *msg, ...)
va_end(args);
}
+/**
+ * debug_safe - async-safe write to debug output
+ * @msg: a string message
+ *
+ * This function prints the message @msg to the debugging output in a
+ * way that is async safe and can be used in signal handlers. No newline
+ * character is appended.
+ */
+void
+debug_safe(const char *msg)
+{
+ if (dbg_fd >= 0)
+ write(dbg_fd, msg, strlen(msg));
+}
+
static list *
default_log_list(int initial, const char **syslog_name)
{
@@ -422,8 +438,10 @@ done:
void
log_init_debug(char *f)
{
+ dbg_fd = -1;
if (dbgf && dbgf != stderr)
fclose(dbgf);
+
if (!f)
dbgf = NULL;
else if (!*f)
@@ -434,6 +452,10 @@ log_init_debug(char *f)
fprintf(stderr, "bird: Unable to open debug file %s: %s\n", f, strerror(errno));
exit(1);
}
+
if (dbgf)
+ {
setvbuf(dbgf, NULL, _IONBF, 0);
+ dbg_fd = fileno(dbgf);
+ }
}