diff options
author | Natanael Copa <ncopa@alpinelinux.org> | 2011-09-06 14:53:03 +0200 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2011-09-06 14:53:03 +0200 |
commit | 8e0e105eed7fb3227e6e2f189d83a5943fd043b6 (patch) | |
tree | 64c5b870a35d029b91d48428d4683bf0daa6a0ba | |
parent | 852fd592b073281162627ef4570d75d96e1263fb (diff) | |
download | pingu-8e0e105eed7fb3227e6e2f189d83a5943fd043b6.tar.bz2 pingu-8e0e105eed7fb3227e6e2f189d83a5943fd043b6.tar.xz |
pingu: cleanup on exit
We remove the ip rule, close the ping sockets and netlink sockets.
-rw-r--r-- | pingu.c | 3 | ||||
-rw-r--r-- | pingu_iface.c | 9 | ||||
-rw-r--r-- | pingu_iface.h | 1 | ||||
-rw-r--r-- | pingu_netlink.c | 15 | ||||
-rw-r--r-- | pingu_netlink.h | 2 |
5 files changed, 29 insertions, 1 deletions
@@ -171,6 +171,9 @@ int main(int argc, char *argv[]) ev_signal_start(loop, &signal_watcher); ev_run(loop, 0); + + pingu_iface_cleanup(); + kernel_close(); return 0; } diff --git a/pingu_iface.c b/pingu_iface.c index 00cb1ca..04b180a 100644 --- a/pingu_iface.c +++ b/pingu_iface.c @@ -202,3 +202,12 @@ int pingu_iface_init(struct ev_loop *loop) } return 0; } + +void pingu_iface_cleanup(void) +{ + struct pingu_iface *iface; + list_for_each_entry(iface, &iface_list, iface_list_entry) { + kernel_cleanup_iface(iface); + close(iface->fd); + } +} diff --git a/pingu_iface.h b/pingu_iface.h index 5b09c7e..87f78e4 100644 --- a/pingu_iface.h +++ b/pingu_iface.h @@ -41,5 +41,6 @@ int pingu_iface_set_route_table(struct pingu_iface *iface, int table); void pingu_iface_gw_action(struct pingu_iface *iface, struct pingu_gateway *gw, int action); void pingu_iface_update_routes(struct pingu_iface *iface, int action); +void pingu_iface_cleanup(void); #endif diff --git a/pingu_netlink.c b/pingu_netlink.c index f3ca952..4547670 100644 --- a/pingu_netlink.c +++ b/pingu_netlink.c @@ -637,7 +637,8 @@ static void netlink_read_cb(struct ev_loop *loop, struct ev_io *w, int revents) static void netlink_close(struct ev_loop *loop, struct netlink_fd *fd) { if (fd->fd >= 0) { - ev_io_stop(loop, &fd->io); + if (loop != NULL) + ev_io_stop(loop, &fd->io); close(fd->fd); fd->fd = 0; } @@ -737,3 +738,15 @@ err_close_all: return FALSE; } +void kernel_cleanup_iface(struct pingu_iface *iface) +{ + netlink_rule_del(&talk_fd, iface); +} + +void kernel_close(void) +{ + int i; + for (i = 0; i < ARRAY_SIZE(netlink_groups); i++) + netlink_close(NULL, &netlink_fds[i]); +} + diff --git a/pingu_netlink.h b/pingu_netlink.h index bb9907f..3298964 100644 --- a/pingu_netlink.h +++ b/pingu_netlink.h @@ -8,5 +8,7 @@ int kernel_init(struct ev_loop *loop); int kernel_route_modify(int action, struct pingu_gateway *route, struct pingu_iface *iface, int table); int kernel_route_multipath(int action, struct list_head *iface_list, int table); +void kernel_cleanup_iface(struct pingu_iface *iface); +void kernel_close(void); #endif |