Merge pull request #34511 from YHNdnzj/strv-extend-strv-consume
basic/strv: introduce strv_extend_strv_consume()
This commit is contained in:
@@ -176,7 +176,7 @@ static int parse_path_many(
|
||||
return r;
|
||||
}
|
||||
|
||||
return strv_extend_strv(s, f, /* filter_duplicates= */ false);
|
||||
return strv_extend_strv_consume(s, TAKE_PTR(f), /* filter_duplicates= */ false);
|
||||
}
|
||||
|
||||
static int parse_tries(const char *fname, const char **p, unsigned *ret) {
|
||||
|
||||
@@ -18,15 +18,10 @@ int bus_map_id128(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_err
|
||||
}
|
||||
|
||||
int bus_map_strv_sort(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata) {
|
||||
_cleanup_strv_free_ char **l = NULL;
|
||||
char ***p = userdata;
|
||||
char ***p = ASSERT_PTR(userdata);
|
||||
int r;
|
||||
|
||||
r = sd_bus_message_read_strv_extend(m, &l);
|
||||
if (r < 0)
|
||||
return bus_log_parse_error_debug(r);
|
||||
|
||||
r = strv_extend_strv(p, l, false);
|
||||
r = sd_bus_message_read_strv_extend(m, p);
|
||||
if (r < 0)
|
||||
return bus_log_parse_error_debug(r);
|
||||
|
||||
@@ -34,10 +29,13 @@ int bus_map_strv_sort(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int map_basic(sd_bus *bus, const char *member, sd_bus_message *m, unsigned flags, sd_bus_error *error, void *userdata) {
|
||||
static int map_basic(sd_bus_message *m, unsigned flags, void *userdata) {
|
||||
char type;
|
||||
int r;
|
||||
|
||||
assert(m);
|
||||
assert(userdata);
|
||||
|
||||
r = sd_bus_message_peek_type(m, &type, NULL);
|
||||
if (r < 0)
|
||||
return bus_log_parse_error_debug(r);
|
||||
@@ -46,32 +44,29 @@ static int map_basic(sd_bus *bus, const char *member, sd_bus_message *m, unsigne
|
||||
|
||||
case SD_BUS_TYPE_STRING:
|
||||
case SD_BUS_TYPE_OBJECT_PATH: {
|
||||
const char **p = userdata;
|
||||
const char *s;
|
||||
const char **p = userdata, *s;
|
||||
|
||||
r = sd_bus_message_read_basic(m, type, &s);
|
||||
if (r < 0)
|
||||
return bus_log_parse_error_debug(r);
|
||||
|
||||
if (isempty(s))
|
||||
s = NULL;
|
||||
s = empty_to_null(s);
|
||||
|
||||
if (flags & BUS_MAP_STRDUP)
|
||||
return free_and_strdup((char **) userdata, s);
|
||||
if (FLAGS_SET(flags, BUS_MAP_STRDUP))
|
||||
return free_and_strdup((char**) p, s);
|
||||
|
||||
*p = s;
|
||||
return 0;
|
||||
}
|
||||
|
||||
case SD_BUS_TYPE_ARRAY: {
|
||||
_cleanup_strv_free_ char **l = NULL;
|
||||
char ***p = userdata;
|
||||
|
||||
r = sd_bus_message_read_strv_extend(m, &l);
|
||||
r = sd_bus_message_read_strv_extend(m, p);
|
||||
if (r < 0)
|
||||
return bus_log_parse_error_debug(r);
|
||||
|
||||
return strv_extend_strv(p, l, false);
|
||||
return 0;
|
||||
}
|
||||
|
||||
case SD_BUS_TYPE_BOOLEAN: {
|
||||
@@ -91,40 +86,39 @@ static int map_basic(sd_bus *bus, const char *member, sd_bus_message *m, unsigne
|
||||
|
||||
case SD_BUS_TYPE_INT32:
|
||||
case SD_BUS_TYPE_UINT32: {
|
||||
uint32_t u, *p = userdata;
|
||||
uint32_t *p = userdata;
|
||||
|
||||
r = sd_bus_message_read_basic(m, type, &u);
|
||||
r = sd_bus_message_read_basic(m, type, p);
|
||||
if (r < 0)
|
||||
return bus_log_parse_error_debug(r);
|
||||
|
||||
*p = u;
|
||||
return 0;
|
||||
}
|
||||
|
||||
case SD_BUS_TYPE_INT64:
|
||||
case SD_BUS_TYPE_UINT64: {
|
||||
uint64_t t, *p = userdata;
|
||||
uint64_t *p = userdata;
|
||||
|
||||
r = sd_bus_message_read_basic(m, type, &t);
|
||||
r = sd_bus_message_read_basic(m, type, p);
|
||||
if (r < 0)
|
||||
return bus_log_parse_error_debug(r);
|
||||
|
||||
*p = t;
|
||||
return 0;
|
||||
}
|
||||
|
||||
case SD_BUS_TYPE_DOUBLE: {
|
||||
double d, *p = userdata;
|
||||
double *p = userdata;
|
||||
|
||||
r = sd_bus_message_read_basic(m, type, &d);
|
||||
r = sd_bus_message_read_basic(m, type, p);
|
||||
if (r < 0)
|
||||
return bus_log_parse_error_debug(r);
|
||||
|
||||
*p = d;
|
||||
return 0;
|
||||
}}
|
||||
}
|
||||
|
||||
return -EOPNOTSUPP;
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
}
|
||||
|
||||
int bus_message_map_all_properties(
|
||||
@@ -173,7 +167,7 @@ int bus_message_map_all_properties(
|
||||
if (map[i].set)
|
||||
r = prop->set(sd_bus_message_get_bus(m), member, m, error, v);
|
||||
else
|
||||
r = map_basic(sd_bus_message_get_bus(m), member, m, flags, error, v);
|
||||
r = map_basic(m, flags, v);
|
||||
if (r < 0)
|
||||
return bus_log_parse_error_debug(r);
|
||||
|
||||
|
||||
@@ -1343,7 +1343,7 @@ int config_parse_strv(
|
||||
return log_oom();
|
||||
}
|
||||
|
||||
r = strv_extend_strv(sv, strv, /* filter_duplicates = */ ltype);
|
||||
r = strv_extend_strv_consume(sv, TAKE_PTR(strv), /* filter_duplicates = */ ltype);
|
||||
if (r < 0)
|
||||
return log_oom();
|
||||
|
||||
|
||||
@@ -49,25 +49,8 @@ int dlopen_libkmod(void) {
|
||||
DLSYM_ARG(kmod_validate_resources));
|
||||
}
|
||||
|
||||
static int denylist_modules(const char *p, char ***denylist) {
|
||||
_cleanup_strv_free_ char **k = NULL;
|
||||
int r;
|
||||
|
||||
assert(p);
|
||||
assert(denylist);
|
||||
|
||||
k = strv_split(p, ",");
|
||||
if (!k)
|
||||
return -ENOMEM;
|
||||
|
||||
r = strv_extend_strv(denylist, k, /* filter_duplicates= */ true);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_proc_cmdline_item(const char *key, const char *value, void *data) {
|
||||
char ***denylist = ASSERT_PTR(data);
|
||||
int r;
|
||||
|
||||
if (proc_cmdline_key_streq(key, "module_blacklist")) {
|
||||
@@ -75,7 +58,7 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat
|
||||
if (proc_cmdline_value_missing(key, value))
|
||||
return 0;
|
||||
|
||||
r = denylist_modules(value, data);
|
||||
r = strv_split_and_extend(denylist, value, ",", /* filter_duplicates = */ true);
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -208,6 +208,19 @@ static inline int run_test_table(void) {
|
||||
#define DEFINE_TEST_MAIN(log_level) \
|
||||
DEFINE_TEST_MAIN_FULL(log_level, NULL, NULL)
|
||||
|
||||
#define DECIMAL_STR_FMT(x) _Generic((x), \
|
||||
char: "%c", \
|
||||
bool: "%d", \
|
||||
unsigned char: "%d", \
|
||||
short: "%hd", \
|
||||
unsigned short: "%hu", \
|
||||
int: "%d", \
|
||||
unsigned: "%u", \
|
||||
long: "%ld", \
|
||||
unsigned long: "%lu", \
|
||||
long long: "%lld", \
|
||||
unsigned long long: "%llu")
|
||||
|
||||
#define ASSERT_OK(expr) \
|
||||
({ \
|
||||
typeof(expr) _result = (expr); \
|
||||
|
||||
@@ -626,16 +626,15 @@ static int json_dispatch_weight(const char *name, sd_json_variant *variant, sd_j
|
||||
}
|
||||
|
||||
int json_dispatch_user_group_list(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata) {
|
||||
char ***list = ASSERT_PTR(userdata);
|
||||
_cleanup_strv_free_ char **l = NULL;
|
||||
char ***list = userdata;
|
||||
sd_json_variant *e;
|
||||
int r;
|
||||
|
||||
if (!sd_json_variant_is_array(variant))
|
||||
return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not an array of strings.", strna(name));
|
||||
|
||||
sd_json_variant *e;
|
||||
JSON_VARIANT_ARRAY_FOREACH(e, variant) {
|
||||
|
||||
if (!sd_json_variant_is_string(e))
|
||||
return json_log(e, flags, SYNTHETIC_ERRNO(EINVAL), "JSON array element is not a string.");
|
||||
|
||||
@@ -647,7 +646,7 @@ int json_dispatch_user_group_list(const char *name, sd_json_variant *variant, sd
|
||||
return json_log(e, flags, r, "Failed to append array element: %m");
|
||||
}
|
||||
|
||||
r = strv_extend_strv(list, l, true);
|
||||
r = strv_extend_strv_consume(list, TAKE_PTR(l), /* filter_duplicates = */ true);
|
||||
if (r < 0)
|
||||
return json_log(variant, flags, r, "Failed to merge user/group arrays: %m");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user