From fb66b29c6701129f0222275eaa206f7ac8ab30cc Mon Sep 17 00:00:00 2001 From: Paul Jakma Date: Sun, 28 May 2006 08:26:15 +0000 Subject: [lib] Add support for Sun libc printstack to zlog_backtrace_sigsafe 2006-05-28 Paul Jakma * configure.ac: Check for Sun libc printstack(), add a general HAVE_STACK_TRACE define for lib/log.c, if any supported stack symbol dumping function is found (glibc backtrace/sun libc printstack). * log.c: (general) Add support for Sun libc printstack(). (hex_append) make the cpp conditional on general HAVE_STACK_TRACE define. (zlog_backtrace_sigsafe) Ditto. Add printstack() version of the the DUMP macro in this function. --- lib/log.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) (limited to 'lib/log.c') diff --git a/lib/log.c b/lib/log.c index d55ffb7f..3eb0bd52 100644 --- a/lib/log.c +++ b/lib/log.c @@ -1,5 +1,5 @@ /* - * $Id: log.c,v 1.27 2006/05/15 16:56:51 paul Exp $ + * $Id$ * * Logging of zebra * Copyright (C) 1997, 1998, 1999 Kunihiro Ishiguro @@ -179,7 +179,7 @@ num_append(char *s, int len, u_long x) return str_append(s,len,t); } -#if defined(SA_SIGINFO) || defined(HAVE_GLIBC_BACKTRACE) +#if defined(SA_SIGINFO) || defined(HAVE_STACK_TRACE) static char * hex_append(char *s, int len, u_long x) { @@ -371,7 +371,7 @@ zlog_signal(int signo, const char *action void zlog_backtrace_sigsafe(int priority, void *program_counter) { -#ifdef HAVE_GLIBC_BACKTRACE +#ifdef HAVE_STACK_TRACE static const char pclabel[] = "Program counter: "; void *array[20]; int size; @@ -379,13 +379,10 @@ zlog_backtrace_sigsafe(int priority, void *program_counter) char *s; #define LOC s,buf+sizeof(buf)-s +#ifdef HAVE_GLIBC_BACKTRACE if (((size = backtrace(array,sizeof(array)/sizeof(array[0]))) <= 0) || ((size_t)size > sizeof(array)/sizeof(array[0]))) return; - s = buf; - s = str_append(LOC,"Backtrace for "); - s = num_append(LOC,size); - s = str_append(LOC," stack frames:\n"); #define DUMP(FD) { \ if (program_counter) \ @@ -396,6 +393,19 @@ zlog_backtrace_sigsafe(int priority, void *program_counter) write(FD, buf, s-buf); \ backtrace_symbols_fd(array, size, FD); \ } +#elif defined(HAVE_PRINTSTACK) +#define DUMP(FD) { \ + if (program_counter) \ + write((FD), pclabel, sizeof(pclabel)-1); \ + write((FD), buf, s-buf); \ + printstack((FD)); \ +} +#endif /* HAVE_GLIBC_BACKTRACE, HAVE_PRINTSTACK */ + + s = buf; + s = str_append(LOC,"Backtrace for "); + s = num_append(LOC,size); + s = str_append(LOC," stack frames:\n"); if ((logfile_fd >= 0) || ((logfile_fd = open_crashlog()) >= 0)) DUMP(logfile_fd) @@ -431,7 +441,7 @@ zlog_backtrace_sigsafe(int priority, void *program_counter) } #undef DUMP #undef LOC -#endif /* HAVE_GLIBC_BACKTRACE */ +#endif /* HAVE_STRACK_TRACE */ } void -- cgit v1.2.1