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