summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorajs <ajs>2005-01-18 22:18:59 +0000
committerajs <ajs>2005-01-18 22:18:59 +0000
commit31364274ddd1da6b77dd99e1d5d164b5c643732b (patch)
tree4f0ae083583fb605508ef981e96fb230d7110c41
parent92365889d1f856f323af452bad76f54c15ccdf45 (diff)
2005-01-18 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
* log.h: Test for SA_SIGINFO to see whether zlog_signal takes final two args (siginfo and program_counter). * log.c: (hex_append) Include this function only if SA_SIGINFO or HAVE_GLIBC_BACKTRACE is defined. (zlog_signal) Final two args (siginfo and program_counter) now depend on whether SA_SIGINFO is defined on this platform. * sigevent.c: (program_counter) Do not include this function if SA_SIGINFO is not defined on this platform. (exit_handler,core_handler) Test for SA_SIGINFO to decide whether 2nd & 3rd arguments are present and to decide how to invoke zlog_signal. (trap_default_signals) Test for SA_SIGINFO and invoke sigaction appropriately.
-rw-r--r--lib/ChangeLog16
-rw-r--r--lib/log.c23
-rw-r--r--lib/log.h9
-rw-r--r--lib/sigevent.c41
4 files changed, 77 insertions, 12 deletions
diff --git a/lib/ChangeLog b/lib/ChangeLog
index 519467be..d17d7e08 100644
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -1,3 +1,19 @@
+2005-01-18 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
+
+ * log.h: Test for SA_SIGINFO to see whether zlog_signal takes final
+ two args (siginfo and program_counter).
+ * log.c: (hex_append) Include this function only if SA_SIGINFO or
+ HAVE_GLIBC_BACKTRACE is defined.
+ (zlog_signal) Final two args (siginfo and program_counter) now
+ depend on whether SA_SIGINFO is defined on this platform.
+ * sigevent.c: (program_counter) Do not include this function if
+ SA_SIGINFO is not defined on this platform.
+ (exit_handler,core_handler) Test for SA_SIGINFO to decide whether
+ 2nd & 3rd arguments are present and to decide how to invoke
+ zlog_signal.
+ (trap_default_signals) Test for SA_SIGINFO and invoke sigaction
+ appropriately.
+
2005-01-17 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
* log.h: Change prototype for zlog_backtrace_sigsafe to take additional
diff --git a/lib/log.c b/lib/log.c
index a639745d..2efc30f6 100644
--- a/lib/log.c
+++ b/lib/log.c
@@ -1,5 +1,5 @@
/*
- * $Id: log.c,v 1.22 2005/01/17 15:22:28 ajs Exp $
+ * $Id: log.c,v 1.23 2005/01/18 22:18:59 ajs Exp $
*
* Logging of zebra
* Copyright (C) 1997, 1998, 1999 Kunihiro Ishiguro
@@ -177,6 +177,7 @@ num_append(char *s, int len, u_long x)
return str_append(s,len,t);
}
+#if defined(SA_SIGINFO) || defined(HAVE_GLIBC_BACKTRACE)
static char *
hex_append(char *s, int len, u_long x)
{
@@ -194,6 +195,7 @@ hex_append(char *s, int len, u_long x)
}
return str_append(s,len,t);
}
+#endif
static int syslog_fd = -1;
@@ -258,8 +260,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, siginfo_t *siginfo,
- void *program_counter)
+zlog_signal(int signo, const char *action
+#ifdef SA_SIGINFO
+ , siginfo_t *siginfo, void *program_counter
+#endif
+ )
{
time_t now;
char buf[sizeof("DEFAULT: Received signal S at T (si_addr 0xP, PC 0xP); aborting...")+100];
@@ -279,6 +284,7 @@ zlog_signal(int signo, const char *action, siginfo_t *siginfo,
s = num_append(LOC,signo);
s = str_append(LOC," at ");
s = num_append(LOC,now);
+#ifdef SA_SIGINFO
s = str_append(LOC," (si_addr 0x");
s = hex_append(LOC,(u_long)(siginfo->si_addr));
if (program_counter)
@@ -287,6 +293,9 @@ zlog_signal(int signo, const char *action, siginfo_t *siginfo,
s = hex_append(LOC,(u_long)program_counter);
}
s = str_append(LOC,"); ");
+#else /* SA_SIGINFO */
+ s = str_append(LOC,"; ");
+#endif /* SA_SIGINFO */
s = str_append(LOC,action);
if (s < buf+sizeof(buf))
*s++ = '\n';
@@ -312,7 +321,13 @@ zlog_signal(int signo, const char *action, siginfo_t *siginfo,
}
#undef DUMP
- zlog_backtrace_sigsafe(PRI, program_counter);
+ zlog_backtrace_sigsafe(PRI,
+#ifdef SA_SIGINFO
+ program_counter
+#else
+ NULL
+#endif
+ );
#undef PRI
#undef LOC
}
diff --git a/lib/log.h b/lib/log.h
index 43b5f1c2..46c4f11d 100644
--- a/lib/log.h
+++ b/lib/log.h
@@ -1,5 +1,5 @@
/*
- * $Id: log.h,v 1.16 2005/01/17 15:22:28 ajs Exp $
+ * $Id: log.h,v 1.17 2005/01/18 22:18:59 ajs Exp $
*
* Zebra logging funcions.
* Copyright (C) 1997, 1998, 1999 Kunihiro Ishiguro
@@ -153,8 +153,11 @@ extern const char *zlog_proto_names[];
extern const char *safe_strerror(int errnum);
/* To be called when a fatal signal is caught. */
-extern void zlog_signal(int signo, const char *action,
- siginfo_t *siginfo, void *program_counter);
+extern void zlog_signal(int signo, const char *action
+#ifdef SA_SIGINFO
+ , siginfo_t *siginfo, void *program_counter
+#endif
+ );
/* Log a backtrace. */
extern void zlog_backtrace(int priority);
diff --git a/lib/sigevent.c b/lib/sigevent.c
index 7acdad29..9c25d764 100644
--- a/lib/sigevent.c
+++ b/lib/sigevent.c
@@ -23,6 +23,7 @@
#include <sigevent.h>
#include <log.h>
+#ifdef SA_SIGINFO
#ifdef HAVE_UCONTEXT_H
#ifdef GNU_LINUX
/* get REG_EIP from ucontext.h */
@@ -30,6 +31,7 @@
#endif /* GNU_LINUX */
#include <ucontext.h>
#endif /* HAVE_UCONTEXT_H */
+#endif /* SA_SIGINFO */
/* master signals descriptor struct */
@@ -161,6 +163,8 @@ signal_set (int signo)
return 0;
}
+#ifdef SA_SIGINFO
+
/* XXX This function should be enhanced to support more platforms
(it currently works only on Linux/x86). */
static void *
@@ -177,17 +181,35 @@ program_counter(void *context)
return NULL;
}
+#endif /* SA_SIGINFO */
+
static void
-exit_handler(int signo, siginfo_t *siginfo, void *context)
+exit_handler(int signo
+#ifdef SA_SIGINFO
+ , siginfo_t *siginfo, void *context
+#endif
+ )
{
- zlog_signal(signo, "exiting...", siginfo, program_counter(context));
+ zlog_signal(signo, "exiting..."
+#ifdef SA_SIGINFO
+ , siginfo, program_counter(context)
+#endif
+ );
_exit(128+signo);
}
static void
-core_handler(int signo, siginfo_t *siginfo, void *context)
+core_handler(int signo
+#ifdef SA_SIGINFO
+ , siginfo_t *siginfo, void *context
+#endif
+ )
{
- zlog_signal(signo, "aborting...", siginfo, program_counter(context));
+ zlog_signal(signo, "aborting..."
+#ifdef SA_SIGINFO
+ , siginfo, program_counter(context)
+#endif
+ );
abort();
}
@@ -236,7 +258,11 @@ trap_default_signals(void)
static const struct {
const int *sigs;
u_int nsigs;
- void (*handler)(int signo, siginfo_t *info, void *context);
+ void (*handler)(int signo
+#ifdef SA_SIGINFO
+ , siginfo_t *info, void *context
+#endif
+ );
} sigmap[] = {
{ core_signals, sizeof(core_signals)/sizeof(core_signals[0]), core_handler},
{ exit_signals, sizeof(exit_signals)/sizeof(exit_signals[0]), exit_handler},
@@ -263,9 +289,14 @@ trap_default_signals(void)
}
else
{
+#ifdef SA_SIGINFO
/* Request extra arguments to signal handler. */
act.sa_sigaction = sigmap[i].handler;
act.sa_flags = SA_SIGINFO;
+#else
+ act.sa_handler = sigmap[i].handler;
+ act.sa_flags = 0;
+#endif
}
if (sigaction(sigmap[i].sigs[j],&act,NULL) < 0)
zlog_warn("Unable to set signal handler for signal %d: %s",