return 0;
}
-int capability_set_from_string(const char *s, uint64_t *set) {
+int capability_set_from_string(const char *s, uint64_t *ret) {
uint64_t val = 0;
-
- assert(set);
+ bool good = true;
for (const char *p = s;;) {
_cleanup_free_ char *word = NULL;
int r;
- r = extract_first_word(&p, &word, NULL, EXTRACT_UNQUOTE);
- if (r == -ENOMEM)
+ r = extract_first_word(&p, &word, NULL, EXTRACT_UNQUOTE|EXTRACT_RELAX);
+ if (r < 0)
return r;
- if (r <= 0)
+ if (r == 0)
break;
r = capability_from_name(word);
- if (r < 0)
- continue;
-
- val |= ((uint64_t) UINT64_C(1)) << (uint64_t) r;
+ if (r < 0) {
+ log_debug_errno(r, "Failed to parse capability '%s', ignoring: %m", word);
+ good = false;
+ } else
+ val |= UINT64_C(1) << r;
}
- *set = val;
+ if (ret)
+ *ret = val;
- return 0;
+ return good;
}
int capability_list_length(void);
int capability_set_to_string(uint64_t set, char **ret);
-int capability_set_from_string(const char *s, uint64_t *set);
+int capability_set_from_string(const char *s, uint64_t *ret);
assert_se(capability_set_to_string(c, &t1) == 0);
assert_se(streq(t1, t));
- assert_se(capability_set_from_string(t1, &c1) == 0);
+ assert_se(capability_set_from_string(t1, &c1) > 0);
assert_se(c1 == c_masked);
free(t1);
TEST(capability_set_from_string) {
uint64_t c;
- assert_se(capability_set_from_string(NULL, &c) == 0);
+ assert_se(capability_set_from_string(NULL, &c) > 0);
assert_se(c == 0);
- assert_se(capability_set_from_string("", &c) == 0);
+ assert_se(capability_set_from_string("", &c) > 0);
assert_se(c == 0);
- assert_se(capability_set_from_string("0", &c) == 0);
+ assert_se(capability_set_from_string("0", &c) > 0);
assert_se(c == UINT64_C(1));
- assert_se(capability_set_from_string("1", &c) == 0);
+ assert_se(capability_set_from_string("1", &c) > 0);
assert_se(c == UINT64_C(1) << 1);
- assert_se(capability_set_from_string("0 1 2 3", &c) == 0);
+ assert_se(capability_set_from_string("0 1 2 3", &c) > 0);
assert_se(c == (UINT64_C(1) << 4) - 1);
}