]> git.puffer.fish Git - mirror/frr.git/commitdiff
2005-01-18 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
authorajs <ajs>
Tue, 18 Jan 2005 22:18:59 +0000 (22:18 +0000)
committerajs <ajs>
Tue, 18 Jan 2005 22:18:59 +0000 (22:18 +0000)
* 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.

lib/ChangeLog
lib/log.c
lib/log.h
lib/sigevent.c

index 519467bec841bde997ad1a54b5c640b093158589..d17d7e08d43dfb36d9a58104062cdea6c36096f9 100644 (file)
@@ -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
index a639745dbf53658860ddec19d40e22855c02c95c..2efc30f68a0cfa7f2c0b89bb0b90d8743cbf59cc 100644 (file)
--- 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
 }
index 43b5f1c2ddb9b0becfbd7847879756af57fb19a8..46c4f11da1e1a244a6fb137922f73bead16aa233 100644 (file)
--- 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);
index 7acdad290a239d827a795f94073ec745be731551..9c25d7649b3d8b6c19673e1426e4543e5de2e754 100644 (file)
@@ -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",