2004-01-19 Paul Jakma <paul@dishone.st>

        * tests/test-sig.c: New file, regression test for sigevents.
        * lib/Makefile.am: add sigevent.{c,h}
        * (isis|rip|ripng|ospf|ospf6|bgp)d/\1_main.c: modify for sigevents.
        * zebra/main.c: ditto.
diff --git a/ChangeLog b/ChangeLog
index ab9b67c..c249328 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2004-01-19 Paul Jakma <paul@dishone.st>
+
+	* tests/test-sig.c: New file, regression test for sigevents.
+	* lib/Makefile.am: add sigevent.{c,h}
+	* (isis|rip|ripng|ospf|ospf6|bgp)d/\1_main.c: modify for sigevents.
+	* zebra/main.c: ditto.
+	
 2004-01-10 Paul Jakma <paul@dishone.st>
 
 	* Makefile.am: redhat/ is a dist subdir too.
diff --git a/bgpd/bgp_main.c b/bgpd/bgp_main.c
index 0472922..effdddd 100644
--- a/bgpd/bgp_main.c
+++ b/bgpd/bgp_main.c
@@ -30,6 +30,7 @@
 #include "prefix.h"
 #include "log.h"
 #include "privs.h"
+#include "sigevent.h"
 
 #include "bgpd/bgpd.h"
 #include "bgpd/bgp_attr.h"
@@ -52,6 +53,27 @@
   { 0 }
 };
 
+/* signal definitions */
+void sighup (void);
+void sigint (void);
+void sigusr1 (void);
+
+struct quagga_signal_t bgp_signals[] = 
+{
+  { 
+    .signal = SIGHUP, 
+    .handler = &sighup,
+  },
+  {
+    .signal = SIGUSR1,
+    .handler = &sigusr1,
+  },
+  {
+    .signal = SIGINT,
+    .handler = &sigint,
+  },
+};
+
 /* Configuration file and directory. */
 char config_current[] = BGP_DEFAULT_CONFIG;
 char config_default[] = SYSCONFDIR BGP_DEFAULT_CONFIG;
@@ -123,7 +145,7 @@
 
 /* SIGHUP handler. */
 void 
-sighup (int sig)
+sighup (void)
 {
   zlog (NULL, LOG_INFO, "SIGHUP received");
 
@@ -143,7 +165,7 @@
 
 /* SIGINT handler. */
 void
-sigint (int sig)
+sigint (void)
 {
   zlog (NULL, LOG_INFO, "Terminating on signal");
 
@@ -155,44 +177,10 @@
 
 /* SIGUSR1 handler. */
 void
-sigusr1 (int sig)
+sigusr1 (void)
 {
   zlog_rotate (NULL);
 }
-
-/* Signale wrapper. */
-RETSIGTYPE *
-signal_set (int signo, void (*func)(int))
-{
-  int ret;
-  struct sigaction sig;
-  struct sigaction osig;
-
-  sig.sa_handler = func;
-  sigemptyset (&sig.sa_mask);
-  sig.sa_flags = 0;
-#ifdef SA_RESTART
-  sig.sa_flags |= SA_RESTART;
-#endif /* SA_RESTART */
-
-  ret = sigaction (signo, &sig, &osig);
-
-  if (ret < 0) 
-    return (SIG_ERR);
-  else
-    return (osig.sa_handler);
-}
-
-/* Initialization of signal handles. */
-void
-signal_init ()
-{
-  signal_set (SIGHUP, sighup);
-  signal_set (SIGINT, sigint);
-  signal_set (SIGTERM, sigint);
-  signal_set (SIGPIPE, SIG_IGN);
-  signal_set (SIGUSR1, sigusr1);
-}
 
 /* Main routine of bgpd. Treatment of argument and start bgp finite
    state machine is handled at here. */
@@ -282,7 +270,7 @@
 
   /* Initializations. */
   srand (time (NULL));
-  signal_init ();
+  signal_init (master, Q_SIGC(bgp_signals), bgp_signals);
   zprivs_init (&bgpd_privs);
   cmd_init (1);
   vty_init (master);
diff --git a/isisd/isis_main.c b/isisd/isis_main.c
index 5681350..51249c5 100644
--- a/isisd/isis_main.c
+++ b/isisd/isis_main.c
@@ -34,6 +34,7 @@
 #include "stream.h"
 #include "if.h"
 #include "privs.h"
+#include "sigevent.h"
 
 #include "isisd/dict.h"
 #include "include-netbsd/iso.h"
@@ -148,8 +149,9 @@
 /*
  * Signal handlers
  */
+
 void 
-sighup (int sig)
+sighup (void)
 {
   zlog_info ("SIGHUP received");
   reload ();
@@ -158,7 +160,7 @@
 }
 
 void
-sigint (int sig)
+sigint (void)
 {
   zlog_info ("SIGINT received");
   terminate (0);
@@ -167,62 +169,38 @@
 }
 
 void
-sigterm (int sig)
+sigterm (void)
 {
   zlog_info ("SIGTERM received");
   terminate (0);
 }
 
 void
-sigusr1 (int sig)
+sigusr1 (void)
 {
   zlog_info ("SIGUSR1 received");
   zlog_rotate (NULL);
 }
 
-/*
- * Signal wrapper. 
- */
-RETSIGTYPE *
-signal_set (int signo, void (*func)(int))
-{
-  int ret;
-  struct sigaction sig;
-  struct sigaction osig;
-
-  sig.sa_handler = func;
-  sigemptyset (&sig.sa_mask);
-  sig.sa_flags = 0;
-#ifdef SA_RESTART
-  sig.sa_flags |= SA_RESTART;
-#endif /* SA_RESTART */
-
-  ret = sigaction (signo, &sig, &osig);
-
-  if (ret < 0) 
-    return (SIG_ERR);
-  else
-    return (osig.sa_handler);
-}
-
-void
-signal_init ()
-{
-  signal_set (SIGHUP, sighup);
-  signal_set (SIGINT, sigint);
-  signal_set (SIGTERM, sigterm);
-  signal_set (SIGPIPE, SIG_IGN);
-#ifdef SIGTSTP
-  signal_set (SIGTSTP, SIG_IGN);
-#endif
-#ifdef SIGTTIN
-  signal_set (SIGTTIN, SIG_IGN);
-#endif
-#ifdef SIGTTOU
-  signal_set (SIGTTOU, SIG_IGN);
-#endif
-  signal_set (SIGUSR1, sigusr1);
-}
+struct quagga_signal_t isisd_signals[] =
+{   
+  { 
+    .signal = SIGHUP,  
+    .handler = &sighup,
+  },
+  {
+    .signal = SIGUSR1,  
+    .handler = &sigusr1,
+  },
+  {
+    .signal = SIGINT,  
+    .handler = &sigint,
+  },
+  {
+    .signal = SIGTERM,
+    .handler = &sigterm,
+  },
+};
 
 /*
  * Main routine of isisd. Parse arguments and handle IS-IS state machine.
@@ -315,7 +293,7 @@
    *  initializations
    */
   zprivs_init (&isisd_privs);
-  signal_init ();
+  signal_init (master, Q_SIGC(isisd_signals), isisd_signals);
   cmd_init (1);
   vty_init (master);
   memory_init ();
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 391c2b7..d8621c5 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -10,7 +10,8 @@
 	print_version.c checksum.c vector.c linklist.c vty.c command.c \
 	sockunion.c prefix.c thread.c if.c memory.c buffer.c table.c hash.c \
 	filter.c routemap.c distribute.c stream.c str.c log.c plist.c \
-	zclient.c sockopt.c smux.c md5.c if_rmap.c keychain.c privs.c debug.c
+	zclient.c sockopt.c smux.c md5.c if_rmap.c keychain.c privs.c \
+	debug.c sigevent.c
 
 libzebra_a_DEPENDENCIES = @LIB_REGEX@
 
@@ -21,7 +22,7 @@
 	memory.h network.h prefix.h routemap.h distribute.h sockunion.h \
 	str.h stream.h table.h thread.h vector.h version.h vty.h zebra.h \
 	plist.h zclient.h sockopt.h smux.h md5-gnu.h if_rmap.h keychain.h \
-	privs.h debug.h
+	privs.h debug.h sigevent.h
 
 EXTRA_DIST = regex.c regex-gnu.h
 
diff --git a/ospfd/ospf_main.c b/ospfd/ospf_main.c
index 51fa7b5..3f1e4fd 100644
--- a/ospfd/ospf_main.c
+++ b/ospfd/ospf_main.c
@@ -38,6 +38,7 @@
 #include "memory.h"
 #include "privs.h"
 #include "debug.h"
+#include "sigevent.h"
 
 #include "ospfd/ospfd.h"
 #include "ospfd/ospf_interface.h"
@@ -125,14 +126,14 @@
 
 /* SIGHUP handler. */
 void 
-sighup (int sig)
+sighup (void)
 {
   zlog (NULL, LOG_INFO, "SIGHUP received");
 }
 
 /* SIGINT handler. */
 void
-sigint (int sig)
+sigint (void)
 {
   zlog (NULL, LOG_INFO, "Terminating on signal");
 
@@ -143,58 +144,26 @@
 
 /* SIGUSR1 handler. */
 void
-sigusr1 (int sig)
+sigusr1 (void)
 {
   zlog_rotate (NULL);
 }
 
-/* Signal wrapper. */
-RETSIGTYPE *
-signal_set (int signo, void (*func)(int))
+struct quagga_signal_t ospf_signals[] =
 {
-  int ret;
-  struct sigaction sig;
-  struct sigaction osig;
-
-  sig.sa_handler = func;
-  sigemptyset (&sig.sa_mask);
-  sig.sa_flags = 0;
-#ifdef SA_RESTART
-  sig.sa_flags |= SA_RESTART;
-#endif /* SA_RESTART */
-
-  ret = sigaction (signo, &sig, &osig);
-
-  if (ret < 0) 
-    return (SIG_ERR);
-  else
-    return (osig.sa_handler);
-}
-
-/* Initialization of signal handles. */
-void
-signal_init ()
-{
-  signal_set (SIGHUP, sighup);
-  signal_set (SIGINT, sigint);
-  signal_set (SIGTERM, sigint);
-  signal_set (SIGPIPE, SIG_IGN);
-#ifdef SIGTSTP
-  signal_set (SIGTSTP, SIG_IGN);
-#endif
-#ifdef SIGTTIN
-  signal_set (SIGTTIN, SIG_IGN);
-#endif
-#ifdef SIGTTOU
-  signal_set (SIGTTOU, SIG_IGN);
-#endif
-  signal_set (SIGUSR1, sigusr1);
-#ifdef HAVE_GLIBC_BACKTRACE
-  signal_set (SIGBUS, debug_print_trace);
-  signal_set (SIGSEGV, debug_print_trace);
-  signal_set (SIGILL, debug_print_trace); 
-#endif /* HAVE_GLIBC_BACKTRACE */
-}
+  {
+    .signal = SIGHUP,
+    .handler = &sighup,
+  },
+  {
+    .signal = SIGUSR1,
+    .handler = &sigusr1,
+  },  
+  {
+    .signal = SIGINT,
+    .handler = &sigint,
+  },
+};
 
 /* OSPFd main routine. */
 int
@@ -285,7 +254,7 @@
 
   /* Library inits. */
   zprivs_init (&ospfd_privs);
-  signal_init ();
+  signal_init (master, Q_SIGC(ospf_signals), ospf_signals);
   cmd_init (1);
   debug_init ();
   vty_init (master);
diff --git a/ripd/rip_main.c b/ripd/rip_main.c
index a87e3b7..8b0d216 100644
--- a/ripd/rip_main.c
+++ b/ripd/rip_main.c
@@ -31,6 +31,7 @@
 #include "keychain.h"
 #include "log.h"
 #include "privs.h"
+#include "sigevent.h"
 
 #include "ripd/ripd.h"
 
@@ -120,32 +121,9 @@
   exit (status);
 }
 
-/* Signale wrapper. */
-RETSIGTYPE *
-signal_set (int signo, void (*func)(int))
-{
-  int ret;
-  struct sigaction sig;
-  struct sigaction osig;
-
-  sig.sa_handler = func;
-  sigemptyset (&sig.sa_mask);
-  sig.sa_flags = 0;
-#ifdef SA_RESTART
-  sig.sa_flags |= SA_RESTART;
-#endif /* SA_RESTART */
-
-  ret = sigaction (signo, &sig, &osig);
-
-  if (ret < 0) 
-    return (SIG_ERR);
-  else
-    return (osig.sa_handler);
-}
-
 /* SIGHUP handler. */
 void 
-sighup (int sig)
+sighup (void)
 {
   zlog_info ("SIGHUP received");
   rip_clean ();
@@ -163,7 +141,7 @@
 
 /* SIGINT handler. */
 void
-sigint (int sig)
+sigint (void)
 {
   zlog (NULL, LOG_INFO, "Terminating on signal");
 
@@ -175,21 +153,26 @@
 
 /* SIGUSR1 handler. */
 void
-sigusr1 (int sig)
+sigusr1 (void)
 {
   zlog_rotate (NULL);
 }
 
-/* Initialization of signal handles. */
-void
-signal_init ()
+struct quagga_signal_t ripd_signals[] =
 {
-  signal_set (SIGHUP, sighup);
-  signal_set (SIGINT, sigint);
-  signal_set (SIGTERM, sigint);
-  signal_set (SIGPIPE, SIG_IGN);
-  signal_set (SIGUSR1, sigusr1);
-}
+  { 
+    .signal = SIGHUP,
+    .handler = &sighup,
+  },
+  { 
+    .signal = SIGUSR1,
+    .handler = &sigusr1,
+  },
+  {
+    .signal = SIGINT,
+    .handler = &sigusr1,
+  },
+};  
 
 /* Main routine of ripd. */
 int
@@ -271,7 +254,7 @@
 
   /* Library initialization. */
   zprivs_init (&ripd_privs);
-  signal_init ();
+  signal_init (master, Q_SIGC(ripd_signals), ripd_signals);
   cmd_init (1);
   vty_init (master);
   memory_init ();
diff --git a/ripngd/ripng_main.c b/ripngd/ripng_main.c
index 9b76267..3beb227 100644
--- a/ripngd/ripng_main.c
+++ b/ripngd/ripng_main.c
@@ -33,6 +33,7 @@
 #include "prefix.h"
 #include "if.h"
 #include "privs.h"
+#include "sigevent.h"
 
 #include "ripngd/ripngd.h"
 
@@ -126,7 +127,7 @@
 
 /* SIGHUP handler. */
 void 
-sighup (int sig)
+sighup (void)
 {
   zlog_info ("SIGHUP received");
   ripng_clean ();
@@ -143,7 +144,7 @@
 
 /* SIGINT handler. */
 void
-sigint (int sig)
+sigint (void)
 {
   zlog_info ("Terminating on signal");
 
@@ -155,44 +156,26 @@
 
 /* SIGUSR1 handler. */
 void
-sigusr1 (int sig)
+sigusr1 (void)
 {
   zlog_rotate (NULL);
 }
 
-/* Signale wrapper. */
-RETSIGTYPE *
-signal_set (int signo, void (*func)(int))
+struct quagga_signal_t ripng_signals[] =
 {
-  int ret;
-  struct sigaction sig;
-  struct sigaction osig;
-
-  sig.sa_handler = func;
-  sigemptyset (&sig.sa_mask);
-  sig.sa_flags = 0;
-#ifdef SA_RESTART
-  sig.sa_flags |= SA_RESTART;
-#endif /* SA_RESTART */
-
-  ret = sigaction (signo, &sig, &osig);
-
-  if (ret < 0) 
-    return (SIG_ERR);
-  else
-    return (osig.sa_handler);
-}
-
-/* Initialization of signal handles. */
-void
-signal_init ()
-{
-  signal_set (SIGHUP, sighup);
-  signal_set (SIGINT, sigint);
-  signal_set (SIGTERM, sigint);
-  signal_set (SIGPIPE, SIG_IGN);
-  signal_set (SIGUSR1, sigusr1);
-}
+  { 
+    .signal = SIGHUP, 
+    .handler = &sighup,
+  },
+  {
+    .signal = SIGUSR1,
+    .handler = &sigusr1,
+  },
+  {
+    .signal = SIGINT,
+    .handler = &sigint,
+  },
+};
 
 /* RIPngd main routine. */
 int
@@ -275,7 +258,7 @@
 
   /* Library inits. */
   zprivs_init (&ripngd_privs);
-  signal_init ();
+  signal_init (master, Q_SIGC(ripng_signals), ripng_signals);
   cmd_init (1);
   vty_init (master);
   memory_init ();
diff --git a/zebra/main.c b/zebra/main.c
index 98227ea..a66734c 100644
--- a/zebra/main.c
+++ b/zebra/main.c
@@ -30,6 +30,7 @@
 #include "prefix.h"
 #include "log.h"
 #include "privs.h"
+#include "sigevent.h"
 
 #include "zebra/rib.h"
 #include "zebra/zserv.h"
@@ -131,7 +132,7 @@
 
 /* SIGHUP handler. */
 void 
-sighup (int sig)
+sighup (void)
 {
   zlog_info ("SIGHUP received");
 
@@ -141,7 +142,7 @@
 
 /* SIGINT handler. */
 void
-sigint (int sig)
+sigint (void)
 {
   /* Decrared in rib.c */
   void rib_close ();
@@ -156,44 +157,26 @@
 
 /* SIGUSR1 handler. */
 void
-sigusr1 (int sig)
+sigusr1 (void)
 {
   zlog_rotate (NULL);
 }
 
-/* Signale wrapper. */
-RETSIGTYPE *
-signal_set (int signo, void (*func)(int))
+struct quagga_signal_t zebra_signals[] =
 {
-  int ret;
-  struct sigaction sig;
-  struct sigaction osig;
-
-  sig.sa_handler = func;
-  sigemptyset (&sig.sa_mask);
-  sig.sa_flags = 0;
-#ifdef SA_RESTART
-  sig.sa_flags |= SA_RESTART;
-#endif /* SA_RESTART */
-
-  ret = sigaction (signo, &sig, &osig);
-
-  if (ret < 0) 
-    return (SIG_ERR);
-  else
-    return (osig.sa_handler);
-}
-
-/* Initialization of signal handles. */
-void
-signal_init ()
-{
-  signal_set (SIGHUP, sighup);
-  signal_set (SIGINT, sigint);
-  signal_set (SIGTERM, sigint);
-  signal_set (SIGPIPE, SIG_IGN);
-  signal_set (SIGUSR1, sigusr1);
-}
+  { 
+    .signal = SIGHUP, 
+    .handler = &sighup,
+  },
+  {
+    .signal = SIGUSR1,
+    .handler = &sigusr1,
+  },
+  {
+    .signal = SIGINT,
+    .handler = &sigusr1,
+  },
+};
 
 /* Main startup routine. */
 int
@@ -289,7 +272,7 @@
   zprivs_init (&zserv_privs);
 
   /* Vty related initialize. */
-  signal_init ();
+  signal_init (zebrad.master, Q_SIGC(zebra_signals), zebra_signals);
   cmd_init (1);
   vty_init (zebrad.master);
   memory_init ();