diff options
-rw-r--r-- | pingu.c | 2 | ||||
-rw-r--r-- | pingu_host.c | 16 | ||||
-rw-r--r-- | pingu_host.h | 1 | ||||
-rw-r--r-- | pingu_iface.c | 14 | ||||
-rw-r--r-- | pingu_ping.c | 8 | ||||
-rw-r--r-- | pingu_ping.h | 1 | ||||
-rw-r--r-- | pingu_route.c | 9 | ||||
-rw-r--r-- | pingu_route.h | 2 |
8 files changed, 51 insertions, 2 deletions
@@ -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 |