summaryrefslogtreecommitdiff
path: root/ospf6d/ospf6_main.c
diff options
context:
space:
mode:
authorTom Goff <thomas.goff@boeing.com>2010-11-10 13:01:41 -0800
committerPaul Jakma <paul@quagga.net>2011-03-21 13:31:16 +0000
commitae2254aa7f2eb7436734f497658f1f26f4bf37c7 (patch)
tree8734f0e2aa855b90d9ec5cb961cd9990b5574905 /ospf6d/ospf6_main.c
parentfd795eb89cc421097f6580016ea9fbd3585d07bb (diff)
ospf6d: Have ospf6d cleanup when it terminates normally
A clean exit makes it easier to use memory debuggers. * ospf6_asbr.c: (ospf6_asbr_terminate) Add a function to do route map cleanup. * ospf6_lsa.c: (ospf6_lsa_terminate) Add a function to cleanup the lsa handler vector. * ospf6_main.c: (ospf6_exit) Add an function that causes ospf6d to gracefully exit. * ospf6_message.c: (ospf6_message_terminate) Add a function that frees the send and receive buffers. * ospf6_top.c: (ospf6_delete) Enable the ospf6_delete() function. Disable ospf6 before freeing everything.
Diffstat (limited to 'ospf6d/ospf6_main.c')
-rw-r--r--ospf6d/ospf6_main.c35
1 files changed, 32 insertions, 3 deletions
diff --git a/ospf6d/ospf6_main.c b/ospf6d/ospf6_main.c
index a7a96a1f..800fae4b 100644
--- a/ospf6d/ospf6_main.c
+++ b/ospf6d/ospf6_main.c
@@ -124,6 +124,35 @@ Report bugs to zebra@zebra.org\n", progname);
exit (status);
}
+static void
+ospf6_exit (int status)
+{
+ extern struct ospf6 *ospf6;
+ extern struct zclient *zclient;
+
+ if (ospf6)
+ ospf6_delete (ospf6);
+
+ ospf6_message_terminate ();
+ ospf6_asbr_terminate ();
+ ospf6_lsa_terminate ();
+
+ if_terminate ();
+ vty_terminate ();
+ cmd_terminate ();
+
+ if (zclient)
+ zclient_free (zclient);
+
+ if (master)
+ thread_master_free (master);
+
+ if (zlog_default)
+ closezlog (zlog_default);
+
+ exit (status);
+}
+
/* SIGHUP handler. */
static void
sighup (void)
@@ -136,7 +165,7 @@ static void
sigint (void)
{
zlog_notice ("Terminating on signal SIGINT");
- exit (0);
+ ospf6_exit (0);
}
/* SIGTERM handler. */
@@ -144,7 +173,7 @@ static void
sigterm (void)
{
zlog_notice ("Terminating on signal SIGTERM");
- exit (0);
+ ospf6_exit (0);
}
/* SIGUSR1 handler. */
@@ -308,7 +337,7 @@ main (int argc, char *argv[], char *envp[])
zlog_warn ("Thread failed");
/* Not reached. */
- exit (0);
+ ospf6_exit (0);
}