mirror of
https://github.com/systemd/systemd.git
synced 2024-10-29 21:55:36 +03:00
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:
parent
8142d73574
commit
3f444e94f5
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user