aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2011-09-06 14:53:03 +0200
committerNatanael Copa <ncopa@alpinelinux.org>2011-09-06 14:53:03 +0200
commit8e0e105eed7fb3227e6e2f189d83a5943fd043b6 (patch)
tree64c5b870a35d029b91d48428d4683bf0daa6a0ba
parent852fd592b073281162627ef4570d75d96e1263fb (diff)
downloadpingu-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.c3
-rw-r--r--pingu_iface.c9
-rw-r--r--pingu_iface.h1
-rw-r--r--pingu_netlink.c15
-rw-r--r--pingu_netlink.h2
5 files changed, 29 insertions, 1 deletions
diff --git a/pingu.c b/pingu.c
index 04859b0..0cd59b8 100644
--- a/pingu.c
+++ b/pingu.c
@@ -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