]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/shared/nsflags.c
udev: gracefully handle ENODEV or friends in opening device node
[thirdparty/systemd.git] / src / shared / nsflags.c
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2
3 #include "alloc-util.h"
4 #include "extract-word.h"
5 #include "namespace-util.h"
6 #include "nsflags.h"
7 #include "string-util.h"
8
9 int namespace_flags_from_string(const char *name, unsigned long *ret) {
10 unsigned long flags = 0;
11 int r;
12
13 assert_se(ret);
14
15 for (;;) {
16 _cleanup_free_ char *word = NULL;
17 unsigned long f = 0;
18 unsigned i;
19
20 r = extract_first_word(&name, &word, NULL, 0);
21 if (r < 0)
22 return r;
23 if (r == 0)
24 break;
25
26 for (i = 0; namespace_info[i].proc_name; i++)
27 if (streq(word, namespace_info[i].proc_name)) {
28 f = namespace_info[i].clone_flag;
29 break;
30 }
31
32 if (f == 0)
33 return -EINVAL;
34
35 flags |= f;
36 }
37
38 *ret = flags;
39 return 0;
40 }
41
42 int namespace_flags_to_string(unsigned long flags, char **ret) {
43 _cleanup_free_ char *s = NULL;
44 unsigned i;
45
46 for (i = 0; namespace_info[i].proc_name; i++) {
47 if ((flags & namespace_info[i].clone_flag) != namespace_info[i].clone_flag)
48 continue;
49
50 if (!strextend_with_separator(&s, " ", namespace_info[i].proc_name))
51 return -ENOMEM;
52 }
53
54 *ret = TAKE_PTR(s);
55
56 return 0;
57 }
58
59 const char* namespace_single_flag_to_string(unsigned long flag) {
60 for (unsigned i = 0; namespace_info[i].proc_name; i++)
61 if (namespace_info[i].clone_flag == flag)
62 return namespace_info[i].proc_name;
63
64 return NULL;
65 }