X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=src%2Fshared%2Fnsflags.c;h=d4cee069dd651a79382f0046c16897b7091f5f2b;hb=HEAD;hp=4e01976d58b2211c777ffa04bf587b89f996e1a7;hpb=b667d50d3443be7fd861d319b5acd525aa15329c;p=thirdparty%2Fsystemd.git diff --git a/src/shared/nsflags.c b/src/shared/nsflags.c index 4e01976d58b..f7f1995a875 100644 --- a/src/shared/nsflags.c +++ b/src/shared/nsflags.c @@ -1,56 +1,14 @@ -/* SPDX-License-Identifier: LGPL-2.1+ */ -/*** - This file is part of systemd. +/* SPDX-License-Identifier: LGPL-2.1-or-later */ - Copyright 2016 Lennart Poettering -***/ - -#include +#include #include "alloc-util.h" #include "extract-word.h" +#include "namespace-util.h" #include "nsflags.h" #include "string-util.h" -const struct namespace_flag_map namespace_flag_map[] = { - { CLONE_NEWCGROUP, "cgroup" }, - { CLONE_NEWIPC, "ipc" }, - { CLONE_NEWNET, "net" }, - /* So, the mount namespace flag is called CLONE_NEWNS for historical reasons. Let's expose it here under a more - * explanatory name: "mnt". This is in-line with how the kernel exposes namespaces in /proc/$PID/ns. */ - { CLONE_NEWNS, "mnt" }, - { CLONE_NEWPID, "pid" }, - { CLONE_NEWUSER, "user" }, - { CLONE_NEWUTS, "uts" }, - {} -}; - -const char* namespace_flag_to_string(unsigned long flag) { - unsigned i; - - flag &= NAMESPACE_FLAGS_ALL; - - for (i = 0; namespace_flag_map[i].name; i++) - if (flag == namespace_flag_map[i].flag) - return namespace_flag_map[i].name; - - return NULL; /* either unknown namespace flag, or a combination of many. This call supports neither. */ -} - -unsigned long namespace_flag_from_string(const char *name) { - unsigned i; - - if (isempty(name)) - return 0; - - for (i = 0; namespace_flag_map[i].name; i++) - if (streq(name, namespace_flag_map[i].name)) - return namespace_flag_map[i].flag; - - return 0; -} - -int namespace_flag_from_string_many(const char *name, unsigned long *ret) { +int namespace_flags_from_string(const char *name, unsigned long *ret) { unsigned long flags = 0; int r; @@ -58,7 +16,8 @@ int namespace_flag_from_string_many(const char *name, unsigned long *ret) { for (;;) { _cleanup_free_ char *word = NULL; - unsigned long f; + unsigned long f = 0; + unsigned i; r = extract_first_word(&name, &word, NULL, 0); if (r < 0) @@ -66,7 +25,12 @@ int namespace_flag_from_string_many(const char *name, unsigned long *ret) { if (r == 0) break; - f = namespace_flag_from_string(word); + for (i = 0; namespace_info[i].proc_name; i++) + if (streq(word, namespace_info[i].proc_name)) { + f = namespace_info[i].clone_flag; + break; + } + if (f == 0) return -EINVAL; @@ -77,27 +41,15 @@ int namespace_flag_from_string_many(const char *name, unsigned long *ret) { return 0; } -int namespace_flag_to_string_many(unsigned long flags, char **ret) { +int namespace_flags_to_string(unsigned long flags, char **ret) { _cleanup_free_ char *s = NULL; unsigned i; - for (i = 0; namespace_flag_map[i].name; i++) { - if ((flags & namespace_flag_map[i].flag) != namespace_flag_map[i].flag) + for (i = 0; namespace_info[i].proc_name; i++) { + if ((flags & namespace_info[i].clone_flag) != namespace_info[i].clone_flag) continue; - if (!s) { - s = strdup(namespace_flag_map[i].name); - if (!s) - return -ENOMEM; - } else { - if (!strextend(&s, " ", namespace_flag_map[i].name, NULL)) - return -ENOMEM; - } - } - - if (!s) { - s = strdup(""); - if (!s) + if (!strextend_with_separator(&s, " ", namespace_info[i].proc_name)) return -ENOMEM; } @@ -105,3 +57,11 @@ int namespace_flag_to_string_many(unsigned long flags, char **ret) { return 0; } + +const char* namespace_single_flag_to_string(unsigned long flag) { + for (unsigned i = 0; namespace_info[i].proc_name; i++) + if (namespace_info[i].clone_flag == flag) + return namespace_info[i].proc_name; + + return NULL; +}