2005-01-17 Andrew J. Schorr <ajschorr@alumni.princeton.edu>

	* log.h: Change prototype for zlog_backtrace_sigsafe to take additional
	  program_counter argument.
	* log.c: (zlog_backtrace_sigsafe) Add additional program_counter
	  argument.  If it is non-NULL, use backtrace_symbols_fd to resolve
	  the address.
	  (zlog_signal) Call zlog_backtrace_sigsafe with additional
	  program_counter argument.

	[pullup candidate]
diff --git a/lib/ChangeLog b/lib/ChangeLog
index ba4bba9..519467b 100644
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -1,3 +1,13 @@
+2005-01-17 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
+
+	* log.h: Change prototype for zlog_backtrace_sigsafe to take additional
+	  program_counter argument.
+	* log.c: (zlog_backtrace_sigsafe) Add additional program_counter
+	  argument.  If it is non-NULL, use backtrace_symbols_fd to resolve
+	  the address.
+	  (zlog_signal) Call zlog_backtrace_sigsafe with additional
+	  program_counter argument.
+
 2005-01-17 Hasso Tepper <hasso at quagga.net>
 
 	* command.[ch], vty.c: cmd_execute_command() function must not attempt
diff --git a/lib/log.c b/lib/log.c
index fcf7c5d..a639745 100644
--- a/lib/log.c
+++ b/lib/log.c
@@ -1,5 +1,5 @@
 /*
- * $Id: log.c,v 1.21 2005/01/12 17:27:27 ajs Exp $
+ * $Id: log.c,v 1.22 2005/01/17 15:22:28 ajs Exp $
  *
  * Logging of zebra
  * Copyright (C) 1997, 1998, 1999 Kunihiro Ishiguro
@@ -312,7 +312,7 @@
     }
 #undef DUMP
 
-  zlog_backtrace_sigsafe(PRI);
+  zlog_backtrace_sigsafe(PRI, program_counter);
 #undef PRI
 #undef LOC
 }
@@ -320,9 +320,10 @@
 /* Log a backtrace using only async-signal-safe functions.
    Needs to be enhanced to support syslog logging. */
 void
-zlog_backtrace_sigsafe(int priority)
+zlog_backtrace_sigsafe(int priority, void *program_counter)
 {
 #ifdef HAVE_GLIBC_BACKTRACE
+  static const char pclabel[] = "Program counter: ";
   void *array[20];
   int size;
   char buf[100];
@@ -338,6 +339,11 @@
   s = str_append(LOC," stack frames:\n");
 
 #define DUMP(FP) { \
+  if (program_counter) \
+    { \
+      write(fileno(FP),pclabel,sizeof(pclabel)-1); \
+      backtrace_symbols_fd(&program_counter, 1, fileno(FP)); \
+    } \
   write(fileno(FP),buf,s-buf);	\
   backtrace_symbols_fd(array, size, fileno(FP)); \
 }
diff --git a/lib/log.h b/lib/log.h
index b828829..43b5f1c 100644
--- a/lib/log.h
+++ b/lib/log.h
@@ -1,5 +1,5 @@
 /*
- * $Id: log.h,v 1.15 2005/01/12 17:27:27 ajs Exp $
+ * $Id: log.h,v 1.16 2005/01/17 15:22:28 ajs Exp $
  *
  * Zebra logging funcions.
  * Copyright (C) 1997, 1998, 1999 Kunihiro Ishiguro
@@ -161,8 +161,9 @@
 
 /* Log a backtrace, but in an async-signal-safe way.  Should not be
    called unless the program is about to exit or abort, since it messes
-   up the state of zlog file pointers. */
-extern void zlog_backtrace_sigsafe(int priority);
+   up the state of zlog file pointers.  If program_counter is non-NULL,
+   that is logged in addition to the current backtrace. */
+extern void zlog_backtrace_sigsafe(int priority, void *program_counter);
 
 /* Defines for use in command construction: */