]>
Commit | Line | Data |
---|---|---|
53e1b683 | 1 | /* SPDX-License-Identifier: LGPL-2.1+ */ |
add00535 LP |
2 | /*** |
3 | This file is part of systemd. | |
4 | ||
5 | Copyright 2016 Lennart Poettering | |
add00535 LP |
6 | ***/ |
7 | ||
8 | #include <sched.h> | |
9 | ||
10 | #include "alloc-util.h" | |
11 | #include "extract-word.h" | |
12 | #include "nsflags.h" | |
add00535 LP |
13 | #include "string-util.h" |
14 | ||
15 | const struct namespace_flag_map namespace_flag_map[] = { | |
16 | { CLONE_NEWCGROUP, "cgroup" }, | |
17 | { CLONE_NEWIPC, "ipc" }, | |
18 | { CLONE_NEWNET, "net" }, | |
19 | /* So, the mount namespace flag is called CLONE_NEWNS for historical reasons. Let's expose it here under a more | |
20 | * explanatory name: "mnt". This is in-line with how the kernel exposes namespaces in /proc/$PID/ns. */ | |
21 | { CLONE_NEWNS, "mnt" }, | |
22 | { CLONE_NEWPID, "pid" }, | |
23 | { CLONE_NEWUSER, "user" }, | |
24 | { CLONE_NEWUTS, "uts" }, | |
25 | {} | |
26 | }; | |
27 | ||
86c2a9f1 | 28 | int namespace_flags_from_string(const char *name, unsigned long *ret) { |
add00535 LP |
29 | unsigned long flags = 0; |
30 | int r; | |
31 | ||
32 | assert_se(ret); | |
33 | ||
add00535 LP |
34 | for (;;) { |
35 | _cleanup_free_ char *word = NULL; | |
86c2a9f1 YW |
36 | unsigned long f = 0; |
37 | unsigned i; | |
add00535 LP |
38 | |
39 | r = extract_first_word(&name, &word, NULL, 0); | |
40 | if (r < 0) | |
41 | return r; | |
42 | if (r == 0) | |
43 | break; | |
44 | ||
86c2a9f1 YW |
45 | for (i = 0; namespace_flag_map[i].name; i++) |
46 | if (streq(word, namespace_flag_map[i].name)) { | |
47 | f = namespace_flag_map[i].flag; | |
48 | break; | |
49 | } | |
50 | ||
add00535 LP |
51 | if (f == 0) |
52 | return -EINVAL; | |
53 | ||
54 | flags |= f; | |
55 | } | |
56 | ||
57 | *ret = flags; | |
58 | return 0; | |
59 | } | |
60 | ||
86c2a9f1 | 61 | int namespace_flags_to_string(unsigned long flags, char **ret) { |
add00535 LP |
62 | _cleanup_free_ char *s = NULL; |
63 | unsigned i; | |
64 | ||
65 | for (i = 0; namespace_flag_map[i].name; i++) { | |
66 | if ((flags & namespace_flag_map[i].flag) != namespace_flag_map[i].flag) | |
67 | continue; | |
68 | ||
86c2a9f1 YW |
69 | if (!strextend_with_separator(&s, " ", namespace_flag_map[i].name, NULL)) |
70 | return -ENOMEM; | |
add00535 LP |
71 | } |
72 | ||
73 | if (!s) { | |
74 | s = strdup(""); | |
75 | if (!s) | |
76 | return -ENOMEM; | |
77 | } | |
78 | ||
ae2a15bc | 79 | *ret = TAKE_PTR(s); |
add00535 LP |
80 | |
81 | return 0; | |
82 | } |