aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pingu.c2
-rw-r--r--pingu_host.c16
-rw-r--r--pingu_host.h1
-rw-r--r--pingu_iface.c14
-rw-r--r--pingu_ping.c8
-rw-r--r--pingu_ping.h1
-rw-r--r--pingu_route.c9
-rw-r--r--pingu_route.h2
8 files changed, 51 insertions, 2 deletions
diff --git a/pingu.c b/pingu.c
index c4ef2e0..39954d9 100644
--- a/pingu.c
+++ b/pingu.c
@@ -184,7 +184,9 @@ int main(int argc, char *argv[])
ev_run(loop, 0);
log_info("Shutting down");
pingu_iface_cleanup();
+ pingu_host_cleanup();
kernel_close();
+ ev_loop_destroy(loop);
return 0;
}
diff --git a/pingu_host.c b/pingu_host.c
index 81719a6..be44343 100644
--- a/pingu_host.c
+++ b/pingu_host.c
@@ -139,3 +139,19 @@ int pingu_host_init(struct ev_loop *loop)
return 0;
}
+void pingu_host_cleanup(void)
+{
+ struct pingu_host *host, *n;
+ list_for_each_entry_safe(host, n, &host_list, host_list_entry) {
+ if (host->host != NULL)
+ free(host->host);
+ if (host->label != NULL)
+ free(host->label);
+ if (host->up_action != NULL)
+ free((void *)host->up_action);
+ if (host->down_action != NULL)
+ free((void *)host->down_action);
+ list_del(&host->host_list_entry);
+ free(host);
+ }
+}
diff --git a/pingu_host.h b/pingu_host.h
index 731d64e..a1d4b38 100644
--- a/pingu_host.h
+++ b/pingu_host.h
@@ -39,5 +39,6 @@ int pingu_host_set_status(struct pingu_host *host, int status);
int pingu_host_init(struct ev_loop *loop);
int pingu_host_verify_status(struct ev_loop *loop, struct pingu_host *host);
void pingu_host_dump_status(int fd, char *filter);
+void pingu_host_cleanup(void);
#endif
diff --git a/pingu_iface.c b/pingu_iface.c
index fb311a5..161a327 100644
--- a/pingu_iface.c
+++ b/pingu_iface.c
@@ -274,7 +274,7 @@ int pingu_iface_init(struct ev_loop *loop)
void pingu_iface_cleanup(void)
{
- struct pingu_iface *iface;
+ struct pingu_iface *iface, *n;
/* remove loadbalance route */
if (load_balanced > 1) {
int err = kernel_route_multipath(RTM_DELROUTE, &iface_list, RT_TABLE_MAIN);
@@ -286,4 +286,16 @@ void pingu_iface_cleanup(void)
kernel_cleanup_iface_routes(iface);
close(iface->fd);
}
+ list_for_each_entry_safe(iface, n, &iface_list, iface_list_entry) {
+ list_del(&iface->iface_list_entry);
+ if (iface->label != NULL)
+ free(iface->label);
+ if (iface->gw_up_action != NULL)
+ free(iface->gw_up_action);
+ if (iface->gw_down_action != NULL)
+ free(iface->gw_down_action);
+ pingu_ping_cleanup(&iface->ping_list);
+ pingu_route_cleanup(&iface->route_list);
+ free(iface);
+ }
}
diff --git a/pingu_ping.c b/pingu_ping.c
index 64f8ab7..43a25ab 100644
--- a/pingu_ping.c
+++ b/pingu_ping.c
@@ -127,3 +127,11 @@ void pingu_ping_read_reply(struct ev_loop *loop, struct pingu_iface *iface)
pingu_ping_handle_reply(loop, ping);
}
+void pingu_ping_cleanup(struct list_head *ping_list)
+{
+ struct pingu_ping *ping, *n;
+ list_for_each_entry_safe(ping, n, ping_list, ping_list_entry) {
+ list_del(&ping->ping_list_entry);
+ free(ping);
+ }
+}
diff --git a/pingu_ping.h b/pingu_ping.h
index 01e25a2..167f29a 100644
--- a/pingu_ping.h
+++ b/pingu_ping.h
@@ -19,5 +19,6 @@ struct pingu_ping {
int pingu_ping_send(struct ev_loop *loop, struct pingu_host *host,
int set_status_on_failure);
void pingu_ping_read_reply(struct ev_loop *loop, struct pingu_iface *iface);
+void pingu_ping_cleanup(struct list_head *ping_list);
#endif
diff --git a/pingu_route.c b/pingu_route.c
index efc8ad0..2099dbc 100644
--- a/pingu_route.c
+++ b/pingu_route.c
@@ -126,3 +126,12 @@ struct pingu_route *pingu_route_first_default(struct list_head *route_list)
}
return NULL;
}
+
+void pingu_route_cleanup(struct list_head *route_list)
+{
+ struct pingu_route *entry, *n;
+ list_for_each_entry_safe(entry, n, route_list, route_list_entry) {
+ list_del(&entry->route_list_entry);
+ free(entry);
+ }
+}
diff --git a/pingu_route.h b/pingu_route.h
index 0d61beb..9be6f21 100644
--- a/pingu_route.h
+++ b/pingu_route.h
@@ -26,6 +26,6 @@ void pingu_route_del(struct list_head *route_list,
struct pingu_route *gw);
int is_default_gw(struct pingu_route *route);
struct pingu_route *pingu_route_first_default(struct list_head *route_list);
-
+void pingu_route_cleanup(struct list_head *route_list);
#endif