From 56dfe34480259eebd91c9a4dc57a6fe15c07e60a Mon Sep 17 00:00:00 2001 From: Andrea Claudi Date: Fri, 28 Jun 2019 14:12:36 +0200 Subject: [PATCH] netns: make netns_{save,restore} static Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1719759 Upstream Status: iproute2.git commit b2e2922373a6c Conflicts: context change due to missing commit e3dbcb2a12ab1 ("netns: add subcommand to attach an existing network namespace") commit b2e2922373a6c65ed08b57926e61f3621d89a70a Author: Matteo Croce Date: Tue Jun 18 16:49:35 2019 +0200 netns: make netns_{save,restore} static The netns_{save,restore} functions are only used in ipnetns.c now, since the restore is not needed anymore after the netns exec command. Move them in ipnetns.c, and make them static. Signed-off-by: Matteo Croce Signed-off-by: Stephen Hemminger --- include/namespace.h | 2 -- ip/ip.c | 1 - ip/ipnetns.c | 31 +++++++++++++++++++++++++++++++ lib/namespace.c | 31 ------------------------------- 4 files changed, 31 insertions(+), 34 deletions(-) diff --git a/include/namespace.h b/include/namespace.h index 89cdda11782e8..e47f9b5d49d12 100644 --- a/include/namespace.h +++ b/include/namespace.h @@ -49,8 +49,6 @@ static inline int setns(int fd, int nstype) } #endif /* HAVE_SETNS */ -void netns_save(void); -void netns_restore(void); int netns_switch(char *netns); int netns_get_fd(const char *netns); int netns_foreach(int (*func)(char *nsname, void *arg), void *arg); diff --git a/ip/ip.c b/ip/ip.c index 6e8230b3ee584..2ca55e37a4c62 100644 --- a/ip/ip.c +++ b/ip/ip.c @@ -158,7 +158,6 @@ static int batch(const char *name) if (!force) break; } - netns_restore(); } if (line) free(line); diff --git a/ip/ipnetns.c b/ip/ipnetns.c index 10bfe2eb69e0b..40848a5cf10ac 100644 --- a/ip/ipnetns.c +++ b/ip/ipnetns.c @@ -42,6 +42,7 @@ static int usage(void) static struct rtnl_handle rtnsh = { .fd = -1 }; static int have_rtnl_getnsid = -1; +static int saved_netns = -1; static int ipnetns_accept_msg(const struct sockaddr_nl *who, struct rtnl_ctrl_data *ctrl, @@ -634,6 +635,33 @@ static int create_netns_dir(void) return 0; } +/* Obtain a FD for the current namespace, so we can reenter it later */ +static void netns_save(void) +{ + if (saved_netns != -1) + return; + + saved_netns = open("/proc/self/ns/net", O_RDONLY | O_CLOEXEC); + if (saved_netns == -1) { + perror("Cannot open init namespace"); + exit(1); + } +} + +static void netns_restore(void) +{ + if (saved_netns == -1) + return; + + if (setns(saved_netns, CLONE_NEWNET)) { + perror("setns"); + exit(1); + } + + close(saved_netns); + saved_netns = -1; +} + static int netns_add(int argc, char **argv) { /* This function creates a new network namespace and @@ -704,8 +732,11 @@ static int netns_add(int argc, char **argv) netns_path, strerror(errno)); goto out_delete; } + netns_restore(); + return 0; out_delete: + netns_restore(); netns_delete(argc, argv); return -1; } diff --git a/lib/namespace.c b/lib/namespace.c index a2aea57ad4109..06ae0a48c2243 100644 --- a/lib/namespace.c +++ b/lib/namespace.c @@ -15,35 +15,6 @@ #include "utils.h" #include "namespace.h" -static int saved_netns = -1; - -/* Obtain a FD for the current namespace, so we can reenter it later */ -void netns_save(void) -{ - if (saved_netns != -1) - return; - - saved_netns = open("/proc/self/ns/net", O_RDONLY | O_CLOEXEC); - if (saved_netns == -1) { - perror("Cannot open init namespace"); - exit(1); - } -} - -void netns_restore(void) -{ - if (saved_netns == -1) - return; - - if (setns(saved_netns, CLONE_NEWNET)) { - perror("setns"); - exit(1); - } - - close(saved_netns); - saved_netns = -1; -} - static void bind_etc(const char *name) { char etc_netns_path[sizeof(NETNS_ETC_DIR) + NAME_MAX]; @@ -90,8 +61,6 @@ int netns_switch(char *name) return -1; } - netns_save(); - if (setns(netns, CLONE_NEWNET) < 0) { fprintf(stderr, "setting the network namespace \"%s\" failed: %s\n", name, strerror(errno)); -- 2.20.1