cap-list: modernize capability_set_from_string() a bit

Make return parameter optional. And return whether there were any caps
we didn't recognize via 0/1 return value.
This commit is contained in:
Lennart Poettering 2023-02-20 12:25:44 +01:00
parent 8142d73574
commit 3f444e94f5
3 changed files with 20 additions and 19 deletions

View file

@ -92,29 +92,30 @@ int capability_set_to_string(uint64_t set, char **ret) {
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;
}

View file

@ -8,4 +8,4 @@ int capability_from_name(const char *name);
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);

View file

@ -60,7 +60,7 @@ static void test_capability_set_one(uint64_t c, const char *t) {
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);
@ -73,19 +73,19 @@ static void test_capability_set_one(uint64_t c, const char *t) {
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);
}