diff --git a/src/namespace.c b/src/namespace.c index cfb81ba0f..f23da48f8 100644 --- a/src/namespace.c +++ b/src/namespace.c @@ -15,6 +15,7 @@ #include #include #include +#include #include /* Opens the namespace and returns the FD or -1 in case of error @@ -39,6 +40,24 @@ static int init_default_namespace() static struct eb_root namespace_tree_root = EB_ROOT; +static void netns_sig_stop(struct sig_handler *sh) +{ + struct ebpt_node *node, *next; + struct netns_entry *entry; + + /* close namespace file descriptors and remove registered namespaces from the + * tree when stopping */ + node = ebpt_first(&namespace_tree_root); + while (node) { + next = ebpt_next(node); + ebpt_delete(node); + entry = container_of(node, struct netns_entry, node); + free(entry->node.key); + close(entry->fd); + node = next; + } +} + int netns_init(void) { int err_code = 0; @@ -55,6 +74,8 @@ int netns_init(void) } } + signal_register_fct(0, netns_sig_stop, 0); + return err_code; }