diff --git a/src/lxc/lxc_unshare.c b/src/lxc/lxc_unshare.c index 498d6e0e6..3a848b23d 100644 --- a/src/lxc/lxc_unshare.c +++ b/src/lxc/lxc_unshare.c @@ -84,51 +84,6 @@ static uid_t lookup_user(const char *optarg) return uid; } -static char *namespaces_list[] = { - "MOUNT", "PID", "UTSNAME", "IPC", - "USER", "NETWORK" -}; -static int cloneflags_list[] = { - CLONE_NEWNS, CLONE_NEWPID, CLONE_NEWUTS, CLONE_NEWIPC, - CLONE_NEWUSER, CLONE_NEWNET -}; - -static int lxc_namespace_2_cloneflag(char *namespace) -{ - int i, len; - len = sizeof(namespaces_list)/sizeof(namespaces_list[0]); - for (i = 0; i < len; i++) - if (!strcmp(namespaces_list[i], namespace)) - return cloneflags_list[i]; - - ERROR("invalid namespace name %s", namespace); - return -1; -} - -static int lxc_fill_namespace_flags(char *flaglist, int *flags) -{ - char *token, *saveptr = NULL; - int aflag; - - if (!flaglist) { - ERROR("need at least one namespace to unshare"); - return -1; - } - - token = strtok_r(flaglist, "|", &saveptr); - while (token) { - - aflag = lxc_namespace_2_cloneflag(token); - if (aflag < 0) - return -1; - - *flags |= aflag; - - token = strtok_r(NULL, "|", &saveptr); - } - return 0; -} - struct start_arg { char ***args; diff --git a/src/lxc/namespace.c b/src/lxc/namespace.c index 3e6fc3aad..3fa027b53 100644 --- a/src/lxc/namespace.c +++ b/src/lxc/namespace.c @@ -69,3 +69,48 @@ pid_t lxc_clone(int (*fn)(void *), void *arg, int flags) return ret; } + +static char *namespaces_list[] = { + "MOUNT", "PID", "UTSNAME", "IPC", + "USER", "NETWORK" +}; +static int cloneflags_list[] = { + CLONE_NEWNS, CLONE_NEWPID, CLONE_NEWUTS, CLONE_NEWIPC, + CLONE_NEWUSER, CLONE_NEWNET +}; + +int lxc_namespace_2_cloneflag(char *namespace) +{ + int i, len; + len = sizeof(namespaces_list)/sizeof(namespaces_list[0]); + for (i = 0; i < len; i++) + if (!strcmp(namespaces_list[i], namespace)) + return cloneflags_list[i]; + + ERROR("invalid namespace name %s", namespace); + return -1; +} + +int lxc_fill_namespace_flags(char *flaglist, int *flags) +{ + char *token, *saveptr = NULL; + int aflag; + + if (!flaglist) { + ERROR("need at least one namespace to unshare"); + return -1; + } + + token = strtok_r(flaglist, "|", &saveptr); + while (token) { + + aflag = lxc_namespace_2_cloneflag(token); + if (aflag < 0) + return -1; + + *flags |= aflag; + + token = strtok_r(NULL, "|", &saveptr); + } + return 0; +} diff --git a/src/lxc/namespace.h b/src/lxc/namespace.h index f839f4510..715dffa0e 100644 --- a/src/lxc/namespace.h +++ b/src/lxc/namespace.h @@ -54,4 +54,7 @@ int clone(int (*fn)(void *), void *child_stack, extern pid_t lxc_clone(int (*fn)(void *), void *arg, int flags); +extern int lxc_namespace_2_cloneflag(char *namespace); +extern int lxc_fill_namespace_flags(char *flaglist, int *flags); + #endif