summaryrefslogtreecommitdiff
path: root/lib/log.c
diff options
context:
space:
mode:
authorajs <ajs>2005-01-12 17:27:27 +0000
committerajs <ajs>2005-01-12 17:27:27 +0000
commit40abf2392ba9f14935dab556f43e674cb5c47cf3 (patch)
tree3c5ff5794940f408b411c5d0204e27dac1014378 /lib/log.c
parent6cf9df088e10baefe04139897f8745a42ea0c772 (diff)
2005-01-12 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
* configure.ac: Test for header file <ucontext.h> (for use in signal processing). * sigevent.c: (trap_default_signals) Use the SA_SIGINFO flag to pass additional siginfo_t and ucontext_t arguments to core_handler and exit_handler. (core_handler,exit_handler) Now invoked with 3 arguments (using SA_SIGINFO). Pass additional info to zlog_signal. (program_counter) New function to find program counter in ucontext_t, needs to be enhanced to support more platforms (currently works only on Linux/x86). * log.h: Change the zlog_signal prototype to add new arguments siginfo_t * and program_counter. * log.c: (zlog_signal) Add new arguments siginfo and program_counter. Include si_addr and program counter (if non-NULL) in message. And remove #ifdef HAVE_GLIBC_BACKTRACE around hex_append, since that is now used to render the si_addr and PC pointers.
Diffstat (limited to 'lib/log.c')
-rw-r--r--lib/log.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/lib/log.c b/lib/log.c
index 1be1c0b0..fcf7c5d5 100644
--- a/lib/log.c
+++ b/lib/log.c
@@ -1,5 +1,5 @@
/*
- * $Id: log.c,v 1.20 2004/12/10 22:43:17 ajs Exp $
+ * $Id: log.c,v 1.21 2005/01/12 17:27:27 ajs Exp $
*
* Logging of zebra
* Copyright (C) 1997, 1998, 1999 Kunihiro Ishiguro
@@ -177,10 +177,6 @@ num_append(char *s, int len, u_long x)
return str_append(s,len,t);
}
-#ifdef HAVE_GLIBC_BACKTRACE
-
-/* This function is used only in zlog_backtrace_sigsafe when glibc
- backtraces are available. */
static char *
hex_append(char *s, int len, u_long x)
{
@@ -199,8 +195,6 @@ hex_append(char *s, int len, u_long x)
return str_append(s,len,t);
}
-#endif /* HAVE_GLIBC_BACKTRACE */
-
static int syslog_fd = -1;
/* Needs to be enhanced to support Solaris. */
@@ -264,10 +258,11 @@ syslog_sigsafe(int priority, const char *msg, size_t msglen)
/* Note: the goal here is to use only async-signal-safe functions. */
void
-zlog_signal(int signo, const char *action)
+zlog_signal(int signo, const char *action, siginfo_t *siginfo,
+ void *program_counter)
{
time_t now;
- char buf[sizeof("DEFAULT: Received signal S at T; aborting...")+60];
+ char buf[sizeof("DEFAULT: Received signal S at T (si_addr 0xP, PC 0xP); aborting...")+100];
char *s = buf;
char *msgstart = buf;
#define LOC s,buf+sizeof(buf)-s
@@ -284,7 +279,14 @@ zlog_signal(int signo, const char *action)
s = num_append(LOC,signo);
s = str_append(LOC," at ");
s = num_append(LOC,now);
- s = str_append(LOC,"; ");
+ s = str_append(LOC," (si_addr 0x");
+ s = hex_append(LOC,(u_long)(siginfo->si_addr));
+ if (program_counter)
+ {
+ s = str_append(LOC,", PC 0x");
+ s = hex_append(LOC,(u_long)program_counter);
+ }
+ s = str_append(LOC,"); ");
s = str_append(LOC,action);
if (s < buf+sizeof(buf))
*s++ = '\n';