diff options
author | Tom Goff <thomas.goff@boeing.com> | 2010-11-10 13:01:41 -0800 |
---|---|---|
committer | Denis Ovsienko <infrastation@yandex.ru> | 2012-01-02 19:50:41 +0400 |
commit | 36d3e8d828e18c5c4cd097f659e3984ff02532cb (patch) | |
tree | d7ec4c0bb657f303e39d8c784f1b3ac45a72d8a9 /ospf6d/ospf6_main.c | |
parent | a809d1cc54a621f4b31397ee5b8b79151baa4bf2 (diff) | |
download | quagga-36d3e8d828e18c5c4cd097f659e3984ff02532cb.tar.bz2 quagga-36d3e8d828e18c5c4cd097f659e3984ff02532cb.tar.xz |
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.
Signed-off-by: Vyacheslav Trushkin <me@dogonthesun.net>
Conflicts:
ospf6d/ospf6_lsa.h
Diffstat (limited to 'ospf6d/ospf6_main.c')
-rw-r--r-- | ospf6d/ospf6_main.c | 35 |
1 files changed, 32 insertions, 3 deletions
diff --git a/ospf6d/ospf6_main.c b/ospf6d/ospf6_main.c index 8444d90f..65fcb597 100644 --- a/ospf6d/ospf6_main.c +++ b/ospf6d/ospf6_main.c @@ -131,6 +131,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) @@ -143,7 +172,7 @@ static void sigint (void) { zlog_notice ("Terminating on signal SIGINT"); - exit (0); + ospf6_exit (0); } /* SIGTERM handler. */ @@ -151,7 +180,7 @@ static void sigterm (void) { zlog_notice ("Terminating on signal SIGTERM"); - exit (0); + ospf6_exit (0); } /* SIGUSR1 handler. */ @@ -325,7 +354,7 @@ main (int argc, char *argv[], char *envp[]) zlog_warn ("Thread failed"); /* Not reached. */ - exit (0); + ospf6_exit (0); } |