aboutsummaryrefslogtreecommitdiffstats
path: root/netlink/librtnl/rtnl.c
diff options
context:
space:
mode:
authorPierre Pfister <ppfister@cisco.com>2016-05-19 14:45:18 +0100
committerPierre Pfister <ppfister@cisco.com>2016-05-19 14:45:18 +0100
commit83ddb4c4bf72b8317d8eda81dbfe3604c62b7f16 (patch)
tree5a55904ca3817b63225befb6165383ee08c635a1 /netlink/librtnl/rtnl.c
parent577cb66a026ecb1395bda1ff941462940420fe24 (diff)
[Netlink] Add format function to get namespace path
Change-Id: I5a3e955696ea4b1b866f6217c375cfce8d722681 Signed-off-by: Pierre Pfister <ppfister@cisco.com>
Diffstat (limited to 'netlink/librtnl/rtnl.c')
-rw-r--r--netlink/librtnl/rtnl.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/netlink/librtnl/rtnl.c b/netlink/librtnl/rtnl.c
index 7f017a8..a0726c9 100644
--- a/netlink/librtnl/rtnl.c
+++ b/netlink/librtnl/rtnl.c
@@ -75,6 +75,18 @@ static vlib_node_registration_t rtnl_process_node;
#define RTNL_BUFFSIZ 16384
#define RTNL_DUMP_TIMEOUT 1
+u8 *format_rtnl_nsname2path(u8 *s, va_list *args)
+{
+ char *nsname = va_arg(*args, char *);
+ if (!nsname || !strlen(nsname)) {
+ return format(s, "/proc/self/ns/net");
+ } else if (strpbrk(nsname, "/") != NULL) {
+ return format(s, "%s", nsname);
+ } else {
+ return format((u8 *)0, "/var/run/netns/%s", nsname);
+ }
+}
+
static_always_inline void
rtnl_schedule_timeout(rtnl_ns_t *ns, f64 when)
{
@@ -177,13 +189,8 @@ int rtnl_exec_in_namespace(u32 stream_index, void *(*fn)(void *), void *arg, voi
int rtnl_exec_in_namespace_by_name(char *nsname, void *(*fn)(void *), void *arg, void **ret)
{
- u8 *s;
int fd;
- if (nsname && strlen(nsname)) {
- s = format(0, "/var/run/netns/%s", nsname);
- } else {
- s = format(0, "/proc/self/ns/net");
- }
+ u8 *s = format((u8 *)0, "%U", format_rtnl_nsname2path, nsname);
if ((fd = open((char *)s, O_RDONLY)) < 0) {
vec_free(s);
@@ -539,13 +546,7 @@ rtnl_stream_open(rtnl_stream_t *template)
rtnl_main_t *rm = &rtnl_main;
rtnl_ns_t *ns;
int fd;
- u8 *s;
-
- if (strlen(template->name)) {
- s = format(0, "/var/run/netns/%s", template->name);
- } else {
- s = format(0, "/proc/self/ns/net");
- }
+ u8 *s = format((u8 *)0, "%U", format_rtnl_nsname2path, template->name);
if ((fd = open((char *)s, O_RDONLY)) < 0) {
vec_free(s);