From: 2xsec Date: Fri, 6 Jul 2018 16:10:10 +0000 (+0900) Subject: namespace: add api to convert namespaces to standard identifiers X-Git-Tag: lxc-3.1.0~216^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=42067d1852eb1e644d6110f46995fa180911f0d3;p=thirdparty%2Flxc.git namespace: add api to convert namespaces to standard identifiers Signed-off-by: 2xsec --- diff --git a/src/lxc/namespace.c b/src/lxc/namespace.c index 2459c9d2e..b6e3938b1 100644 --- a/src/lxc/namespace.c +++ b/src/lxc/namespace.c @@ -193,6 +193,40 @@ int lxc_namespace_2_ns_idx(const char *namespace) return -EINVAL; } +extern int lxc_namespace_2_std_identifiers(char *namespaces) +{ + char **it; + char *del; + + /* The identifiers for namespaces used with lxc-attach and lxc-unshare + * as given on the manpage do not align with the standard identifiers. + * This affects network, mount, and uts namespaces. The standard identifiers + * are: "mnt", "uts", and "net" whereas lxc-attach and lxc-unshare uses + * "MOUNT", "UTSNAME", and "NETWORK". So let's use some cheap memmove()s + * to replace them by their standard identifiers. + * Let's illustrate this with an example: + * Assume the string: + * + * "IPC|MOUNT|PID" + * + * then we memmove() + * + * dest: del + 1 == OUNT|PID + * src: del + 3 == NT|PID + */ + if (!namespaces) + return -1; + + while ((del = strstr(namespaces, "MOUNT"))) + memmove(del + 1, del + 3, strlen(del) - 2); + + for (it = (char *[]){"NETWORK", "UTSNAME", NULL}; it && *it; it++) + while ((del = strstr(namespaces, *it))) + memmove(del + 3, del + 7, strlen(del) - 6); + + return 0; +} + int lxc_fill_namespace_flags(char *flaglist, int *flags) { char *token, *saveptr = NULL; diff --git a/src/lxc/namespace.h b/src/lxc/namespace.h index 4bfe9c4f5..1341af0e6 100644 --- a/src/lxc/namespace.h +++ b/src/lxc/namespace.h @@ -181,6 +181,7 @@ extern pid_t lxc_raw_clone_cb(int (*fn)(void *), void *args, extern int lxc_namespace_2_cloneflag(const char *namespace); extern int lxc_namespace_2_ns_idx(const char *namespace); +extern int lxc_namespace_2_std_identifiers(char *namespaces); extern int lxc_fill_namespace_flags(char *flaglist, int *flags); /**