diff options
-rw-r--r-- | lib/ChangeLog | 16 | ||||
-rw-r--r-- | lib/log.c | 23 | ||||
-rw-r--r-- | lib/log.h | 9 | ||||
-rw-r--r-- | lib/sigevent.c | 41 |
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 @@ -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 } @@ -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", |