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.
diff --git a/lib/ChangeLog b/lib/ChangeLog
index 519467b..d17d7e0 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 a639745..2efc30f 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 @@
   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 @@
     }
   return str_append(s,len,t);
 }
+#endif
 
 static int syslog_fd = -1;
 
@@ -258,8 +260,11 @@
 
 /* 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 @@
   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 @@
       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 @@
     }
 #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 43b5f1c..46c4f11 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 *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 7acdad2..9c25d76 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 @@
     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 @@
   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 @@
   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 @@
 	        }
 	      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",