From 83ddb4c4bf72b8317d8eda81dbfe3604c62b7f16 Mon Sep 17 00:00:00 2001 From: Pierre Pfister Date: Thu, 19 May 2016 14:45:18 +0100 Subject: [Netlink] Add format function to get namespace path Change-Id: I5a3e955696ea4b1b866f6217c375cfce8d722681 Signed-off-by: Pierre Pfister --- netlink/librtnl/rtnl.c | 27 ++++++++++++++------------- netlink/librtnl/rtnl.h | 6 +++++- 2 files changed, 19 insertions(+), 14 deletions(-) (limited to 'netlink/librtnl') 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); diff --git a/netlink/librtnl/rtnl.h b/netlink/librtnl/rtnl.h index 4b4aeff..49f0f27 100644 --- a/netlink/librtnl/rtnl.h +++ b/netlink/librtnl/rtnl.h @@ -16,6 +16,8 @@ #ifndef RTNL_H_ #define RTNL_H_ +#include + #include #include @@ -23,7 +25,7 @@ typedef enum { RTNL_ERR_UNKNOWN, } rtnl_error_t; -#define RTNL_NETNS_NAMELEN 31 +#define RTNL_NETNS_NAMELEN 128 /* * RTNL stream implements an RTNL overlay @@ -53,4 +55,6 @@ void rtnl_stream_close(u32 handle); int rtnl_exec_in_namespace(u32 handle, void *(*fn)(void *), void *arg, void **ret); int rtnl_exec_in_namespace_by_name(char *nsname, void *(*fn)(void *), void *arg, void **ret); +u8 *format_rtnl_nsname2path(u8 *s, va_list *args); + #endif -- cgit 1.2.3-korg