Merge pull request #28946 from poettering/json-variant-append-arrayb

add json_variant_append_arrayb() helper + more related
This commit is contained in:
Lennart Poettering
2023-08-24 13:37:10 +02:00
committed by GitHub
16 changed files with 140 additions and 147 deletions
+7 -12
View File
@@ -693,21 +693,16 @@ static int verb_calculate(int argc, char *argv[], void *userdata) {
printf("%" PRIu32 ":%s=%s\n", TPM_PCR_INDEX_KERNEL_IMAGE, pcr_states[i].bank, hd);
} else {
_cleanup_(json_variant_unrefp) JsonVariant *bv = NULL, *array = NULL;
_cleanup_(json_variant_unrefp) JsonVariant *array = NULL;
array = json_variant_ref(json_variant_by_key(w, pcr_states[i].bank));
r = json_build(&bv,
JSON_BUILD_OBJECT(
JSON_BUILD_PAIR_CONDITION(!isempty(*phase), "phase", JSON_BUILD_STRING(*phase)),
JSON_BUILD_PAIR("pcr", JSON_BUILD_INTEGER(TPM_PCR_INDEX_KERNEL_IMAGE)),
JSON_BUILD_PAIR("hash", JSON_BUILD_HEX(pcr_states[i].value, pcr_states[i].value_size))
)
);
if (r < 0)
return log_error_errno(r, "Failed to build JSON object: %m");
r = json_variant_append_array(&array, bv);
r = json_variant_append_arrayb(
&array,
JSON_BUILD_OBJECT(
JSON_BUILD_PAIR_CONDITION(!isempty(*phase), "phase", JSON_BUILD_STRING(*phase)),
JSON_BUILD_PAIR("pcr", JSON_BUILD_INTEGER(TPM_PCR_INDEX_KERNEL_IMAGE)),
JSON_BUILD_PAIR("hash", JSON_BUILD_HEX(pcr_states[i].value, pcr_states[i].value_size))));
if (r < 0)
return log_error_errno(r, "Failed to append JSON object to array: %m");
+1 -1
View File
@@ -107,7 +107,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
log_debug_errno(r, "json_variant_filter: %d/%m", r);
/* I assume we can merge v with itself… */
r = json_variant_merge(&v, v);
r = json_variant_merge_object(&v, v);
log_debug_errno(r, "json_variant_merge: %d/%m", r);
r = json_variant_append_array(&v, v);
+11 -14
View File
@@ -903,7 +903,7 @@ static int apply_identity_changes(JsonVariant **_v) {
if (r < 0)
return log_error_errno(r, "Failed to filter identity: %m");
r = json_variant_merge(&v, arg_identity_extra);
r = json_variant_merge_object(&v, arg_identity_extra);
if (r < 0)
return log_error_errno(r, "Failed to merge identities: %m");
@@ -948,7 +948,7 @@ static int apply_identity_changes(JsonVariant **_v) {
if (!json_variant_equal(u, mmid))
continue;
r = json_variant_merge(&add, z);
r = json_variant_merge_object(&add, z);
if (r < 0)
return log_error_errno(r, "Failed to merge perMachine entry: %m");
@@ -959,7 +959,7 @@ static int apply_identity_changes(JsonVariant **_v) {
if (r < 0)
return log_error_errno(r, "Failed to filter perMachine: %m");
r = json_variant_merge(&add, arg_identity_extra_this_machine);
r = json_variant_merge_object(&add, arg_identity_extra_this_machine);
if (r < 0)
return log_error_errno(r, "Failed to merge in perMachine fields: %m");
@@ -972,7 +972,7 @@ static int apply_identity_changes(JsonVariant **_v) {
if (r < 0)
return log_error_errno(r, "Failed to filter resource limits: %m");
r = json_variant_merge(&rlv, arg_identity_extra_rlimits);
r = json_variant_merge_object(&rlv, arg_identity_extra_rlimits);
if (r < 0)
return log_error_errno(r, "Failed to set resource limits: %m");
@@ -1033,7 +1033,7 @@ static int apply_identity_changes(JsonVariant **_v) {
if (r < 0)
return log_error_errno(r, "Failed to filter identity (privileged part): %m");
r = json_variant_merge(&privileged, arg_identity_extra_privileged);
r = json_variant_merge_object(&privileged, arg_identity_extra_privileged);
if (r < 0)
return log_error_errno(r, "Failed to merge identities (privileged part): %m");
@@ -2708,7 +2708,7 @@ static int parse_argv(int argc, char *argv[]) {
}
case ARG_RLIMIT: {
_cleanup_(json_variant_unrefp) JsonVariant *v = NULL, *jcur = NULL, *jmax = NULL;
_cleanup_(json_variant_unrefp) JsonVariant *jcur = NULL, *jmax = NULL;
_cleanup_free_ char *field = NULL, *t = NULL;
const char *eq;
struct rlimit rl;
@@ -2764,18 +2764,15 @@ static int parse_argv(int argc, char *argv[]) {
if (r < 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Failed to allocate maximum integer: %m");
r = json_build(&v,
JSON_BUILD_OBJECT(
JSON_BUILD_PAIR("cur", JSON_BUILD_VARIANT(jcur)),
JSON_BUILD_PAIR("max", JSON_BUILD_VARIANT(jmax))));
if (r < 0)
return log_error_errno(r, "Failed to build resource limit: %m");
t = strjoin("RLIMIT_", rlimit_to_string(l));
if (!t)
return log_oom();
r = json_variant_set_field(&arg_identity_extra_rlimits, t, v);
r = json_variant_set_fieldb(
&arg_identity_extra_rlimits, t,
JSON_BUILD_OBJECT(
JSON_BUILD_PAIR("cur", JSON_BUILD_VARIANT(jcur)),
JSON_BUILD_PAIR("max", JSON_BUILD_VARIANT(jmax))));
if (r < 0)
return log_error_errno(r, "Failed to set %s field: %m", rlimit_to_string(l));
+1 -1
View File
@@ -2562,7 +2562,7 @@ int home_augment_status(
if (r < 0)
return r;
r = json_variant_merge(&m, status);
r = json_variant_merge_object(&m, status);
if (r < 0)
return r;
+7 -8
View File
@@ -31,7 +31,7 @@ static int user_record_signable_json(UserRecord *ur, char **ret) {
int user_record_sign(UserRecord *ur, EVP_PKEY *private_key, UserRecord **ret) {
_cleanup_(memstream_done) MemStream m = {};
_cleanup_(json_variant_unrefp) JsonVariant *encoded = NULL, *v = NULL;
_cleanup_(json_variant_unrefp) JsonVariant *v = NULL;
_cleanup_(user_record_unrefp) UserRecord *signed_ur = NULL;
_cleanup_(EVP_MD_CTX_freep) EVP_MD_CTX *md_ctx = NULL;
_cleanup_free_ char *text = NULL, *key = NULL;
@@ -77,15 +77,14 @@ int user_record_sign(UserRecord *ur, EVP_PKEY *private_key, UserRecord **ret) {
if (r < 0)
return r;
r = json_build(&encoded, JSON_BUILD_ARRAY(
JSON_BUILD_OBJECT(JSON_BUILD_PAIR("data", JSON_BUILD_BASE64(signature, signature_size)),
JSON_BUILD_PAIR("key", JSON_BUILD_STRING(key)))));
if (r < 0)
return r;
v = json_variant_ref(ur->json);
r = json_variant_set_field(&v, "signature", encoded);
r = json_variant_set_fieldb(
&v,
"signature",
JSON_BUILD_ARRAY(
JSON_BUILD_OBJECT(JSON_BUILD_PAIR("data", JSON_BUILD_BASE64(signature, signature_size)),
JSON_BUILD_PAIR("key", JSON_BUILD_STRING(key)))));
if (r < 0)
return r;
+1 -1
View File
@@ -353,7 +353,7 @@ int user_record_add_binding(
/* Merge the new entry with an old one, if that exists */
be = json_variant_ref(json_variant_by_key(binding, SD_ID128_TO_STRING(mid)));
if (be) {
r = json_variant_merge(&be, new_binding_entry);
r = json_variant_merge_object(&be, new_binding_entry);
if (r < 0)
return r;
+33 -43
View File
@@ -26,7 +26,7 @@ static int json_append_one(JsonVariant **v, const char *name, JsonVariant *w) {
assert(v);
assert(name);
return json_append(v, JSON_BUILD_OBJECT(JSON_BUILD_PAIR_VARIANT_NON_NULL(name, w)));
return json_variant_merge_objectb(v, JSON_BUILD_OBJECT(JSON_BUILD_PAIR_VARIANT_NON_NULL(name, w)));
}
static int address_build_json(Address *address, JsonVariant **ret) {
@@ -140,15 +140,11 @@ static int nexthop_group_build_json(NextHop *nexthop, JsonVariant **ret) {
assert(ret);
HASHMAP_FOREACH(g, nexthop->group) {
_cleanup_(json_variant_unrefp) JsonVariant *e = NULL;
r = json_build(&e, JSON_BUILD_OBJECT(
JSON_BUILD_PAIR_UNSIGNED("ID", g->id),
JSON_BUILD_PAIR_UNSIGNED("Weight", g->weight+1)));
if (r < 0)
return r;
r = json_variant_append_array(&array, e);
r = json_variant_append_arrayb(
&array,
JSON_BUILD_OBJECT(
JSON_BUILD_PAIR_UNSIGNED("ID", g->id),
JSON_BUILD_PAIR_UNSIGNED("Weight", g->weight+1)));
if (r < 0)
return r;
}
@@ -383,7 +379,8 @@ static int network_append_json(Network *network, JsonVariant **v) {
if (!network)
return 0;
return json_append(v, JSON_BUILD_OBJECT(
return json_variant_merge_objectb(
v, JSON_BUILD_OBJECT(
JSON_BUILD_PAIR_STRING("NetworkFile", network->filename),
JSON_BUILD_PAIR_STRV("NetworkFileDropins", network->dropins),
JSON_BUILD_PAIR_BOOLEAN("RequiredForOnline", network->required_for_online),
@@ -422,7 +419,9 @@ static int device_append_json(sd_device *device, JsonVariant **v) {
if (sd_device_get_property_value(device, "ID_MODEL_FROM_DATABASE", &model) < 0)
(void) sd_device_get_property_value(device, "ID_MODEL", &model);
return json_append(v, JSON_BUILD_OBJECT(
return json_variant_merge_objectb(
v,
JSON_BUILD_OBJECT(
JSON_BUILD_PAIR_STRING_NON_EMPTY("LinkFile", link),
JSON_BUILD_PAIR_STRV_NON_EMPTY("LinkFileDropins", link_dropins),
JSON_BUILD_PAIR_STRING_NON_EMPTY("Path", path),
@@ -431,9 +430,6 @@ static int device_append_json(sd_device *device, JsonVariant **v) {
}
static int dns_append_json_one(Link *link, const struct in_addr_full *a, NetworkConfigSource s, const union in_addr_union *p, JsonVariant **array) {
_cleanup_(json_variant_unrefp) JsonVariant *v = NULL;
int r;
assert(link);
assert(a);
assert(array);
@@ -441,18 +437,16 @@ static int dns_append_json_one(Link *link, const struct in_addr_full *a, Network
if (a->ifindex != 0 && a->ifindex != link->ifindex)
return 0;
r = json_build(&v, JSON_BUILD_OBJECT(
JSON_BUILD_PAIR_INTEGER("Family", a->family),
JSON_BUILD_PAIR_IN_ADDR("Address", &a->address, a->family),
JSON_BUILD_PAIR_UNSIGNED_NON_ZERO("Port", a->port),
JSON_BUILD_PAIR_CONDITION(a->ifindex != 0, "InterfaceIndex", JSON_BUILD_INTEGER(a->ifindex)),
JSON_BUILD_PAIR_STRING_NON_EMPTY("ServerName", a->server_name),
JSON_BUILD_PAIR_STRING("ConfigSource", network_config_source_to_string(s)),
JSON_BUILD_PAIR_IN_ADDR_NON_NULL("ConfigProvider", p, a->family)));
if (r < 0)
return r;
return json_variant_append_array(array, v);
return json_variant_append_arrayb(
array,
JSON_BUILD_OBJECT(
JSON_BUILD_PAIR_INTEGER("Family", a->family),
JSON_BUILD_PAIR_IN_ADDR("Address", &a->address, a->family),
JSON_BUILD_PAIR_UNSIGNED_NON_ZERO("Port", a->port),
JSON_BUILD_PAIR_CONDITION(a->ifindex != 0, "InterfaceIndex", JSON_BUILD_INTEGER(a->ifindex)),
JSON_BUILD_PAIR_STRING_NON_EMPTY("ServerName", a->server_name),
JSON_BUILD_PAIR_STRING("ConfigSource", network_config_source_to_string(s)),
JSON_BUILD_PAIR_IN_ADDR_NON_NULL("ConfigProvider", p, a->family)));
}
static int dns_append_json(Link *link, JsonVariant **v) {
@@ -924,7 +918,7 @@ static int captive_portal_append_json(Link *link, JsonVariant **v) {
if (r <= 0)
return r;
return json_append(v, JSON_BUILD_OBJECT(JSON_BUILD_PAIR_STRING("CaptivePortal", captive_portal)));
return json_variant_merge_objectb(v, JSON_BUILD_OBJECT(JSON_BUILD_PAIR_STRING("CaptivePortal", captive_portal)));
}
static int dhcp_server_offered_leases_append_json(Link *link, JsonVariant **v) {
@@ -939,23 +933,19 @@ static int dhcp_server_offered_leases_append_json(Link *link, JsonVariant **v) {
return 0;
HASHMAP_FOREACH(lease, link->dhcp_server->bound_leases_by_client_id) {
_cleanup_(json_variant_unrefp) JsonVariant *e = NULL;
struct in_addr address = { .s_addr = lease->address };
r = json_build(&e,
JSON_BUILD_OBJECT(
JSON_BUILD_PAIR_BYTE_ARRAY(
"ClientId",
lease->client_id.data,
lease->client_id.length),
JSON_BUILD_PAIR_IN4_ADDR_NON_NULL("Address", &address),
JSON_BUILD_PAIR_STRING_NON_EMPTY("Hostname", lease->hostname),
JSON_BUILD_PAIR_FINITE_USEC(
"ExpirationUSec", lease->expiration)));
if (r < 0)
return r;
r = json_variant_append_array(&array, e);
r = json_variant_append_arrayb(
&array,
JSON_BUILD_OBJECT(
JSON_BUILD_PAIR_BYTE_ARRAY(
"ClientId",
lease->client_id.data,
lease->client_id.length),
JSON_BUILD_PAIR_IN4_ADDR_NON_NULL("Address", &address),
JSON_BUILD_PAIR_STRING_NON_EMPTY("Hostname", lease->hostname),
JSON_BUILD_PAIR_FINITE_USEC(
"ExpirationUSec", lease->expiration)));
if (r < 0)
return r;
}
+6 -8
View File
@@ -1407,7 +1407,7 @@ int dns_cache_dump_to_json(DnsCache *cache, JsonVariant **ret) {
_cleanup_(json_variant_unrefp) JsonVariant *l = NULL;
LIST_FOREACH(by_key, j, i) {
_cleanup_(json_variant_unrefp) JsonVariant *rj = NULL, *item = NULL;
_cleanup_(json_variant_unrefp) JsonVariant *rj = NULL;
assert(j->rr);
@@ -1419,13 +1419,11 @@ int dns_cache_dump_to_json(DnsCache *cache, JsonVariant **ret) {
if (r < 0)
return r;
r = json_build(&item, JSON_BUILD_OBJECT(
JSON_BUILD_PAIR_VARIANT("rr", rj),
JSON_BUILD_PAIR_BASE64("raw", j->rr->wire_format, j->rr->wire_format_size)));
if (r < 0)
return r;
r = json_variant_append_array(&l, item);
r = json_variant_append_arrayb(
&l,
JSON_BUILD_OBJECT(
JSON_BUILD_PAIR_VARIANT("rr", rj),
JSON_BUILD_PAIR_BASE64("raw", j->rr->wire_format, j->rr->wire_format_size)));
if (r < 0)
return r;
}
+7 -9
View File
@@ -1134,7 +1134,7 @@ int manager_monitor_send(
return log_error_errno(r, "Failed to convert question to JSON: %m");
DNS_ANSWER_FOREACH_ITEM(rri, answer) {
_cleanup_(json_variant_unrefp) JsonVariant *v = NULL, *w = NULL;
_cleanup_(json_variant_unrefp) JsonVariant *v = NULL;
r = dns_resource_record_to_json(rri->rr, &v);
if (r < 0)
@@ -1144,14 +1144,12 @@ int manager_monitor_send(
if (r < 0)
return log_error_errno(r, "Failed to generate RR wire format: %m");
r = json_build(&w, JSON_BUILD_OBJECT(
JSON_BUILD_PAIR_CONDITION(v, "rr", JSON_BUILD_VARIANT(v)),
JSON_BUILD_PAIR("raw", JSON_BUILD_BASE64(rri->rr->wire_format, rri->rr->wire_format_size)),
JSON_BUILD_PAIR_CONDITION(rri->ifindex > 0, "ifindex", JSON_BUILD_INTEGER(rri->ifindex))));
if (r < 0)
return log_error_errno(r, "Failed to make answer RR object: %m");
r = json_variant_append_array(&janswer, w);
r = json_variant_append_arrayb(
&janswer,
JSON_BUILD_OBJECT(
JSON_BUILD_PAIR_CONDITION(v, "rr", JSON_BUILD_VARIANT(v)),
JSON_BUILD_PAIR("raw", JSON_BUILD_BASE64(rri->rr->wire_format, rri->rr->wire_format_size)),
JSON_BUILD_PAIR_CONDITION(rri->ifindex > 0, "ifindex", JSON_BUILD_INTEGER(rri->ifindex))));
if (r < 0)
return log_debug_errno(r, "Failed to append notification entry to array: %m");
}
+5 -9
View File
@@ -427,7 +427,6 @@ static void vl_method_resolve_address_complete(DnsQuery *query) {
question = dns_query_question_for_protocol(q, q->answer_protocol);
DNS_ANSWER_FOREACH_IFINDEX(rr, ifindex, q->answer) {
_cleanup_(json_variant_unrefp) JsonVariant *entry = NULL;
_cleanup_free_ char *normalized = NULL;
r = dns_question_matches_rr(question, rr, NULL);
@@ -440,14 +439,11 @@ static void vl_method_resolve_address_complete(DnsQuery *query) {
if (r < 0)
goto finish;
r = json_build(&entry,
JSON_BUILD_OBJECT(
JSON_BUILD_PAIR_CONDITION(ifindex > 0, "ifindex", JSON_BUILD_INTEGER(ifindex)),
JSON_BUILD_PAIR("name", JSON_BUILD_STRING(normalized))));
if (r < 0)
goto finish;
r = json_variant_append_array(&array, entry);
r = json_variant_append_arrayb(
&array,
JSON_BUILD_OBJECT(
JSON_BUILD_PAIR_CONDITION(ifindex > 0, "ifindex", JSON_BUILD_INTEGER(ifindex)),
JSON_BUILD_PAIR("name", JSON_BUILD_STRING(normalized))));
if (r < 0)
goto finish;
}
+4 -2
View File
@@ -1428,7 +1428,8 @@ int show_boot_entries(const BootConfig *config, JsonFormatFlags json_format) {
return log_oom();
}
r = json_append(&v, JSON_BUILD_OBJECT(
r = json_variant_merge_objectb(
&v, JSON_BUILD_OBJECT(
JSON_BUILD_PAIR("type", JSON_BUILD_STRING(boot_entry_type_json_to_string(e->type))),
JSON_BUILD_PAIR_CONDITION(e->id, "id", JSON_BUILD_STRING(e->id)),
JSON_BUILD_PAIR_CONDITION(e->path, "path", JSON_BUILD_STRING(e->path)),
@@ -1451,7 +1452,8 @@ int show_boot_entries(const BootConfig *config, JsonFormatFlags json_format) {
/* Sanitizers (only memory sanitizer?) do not like function call with too many
* arguments and trigger false positive warnings. Let's not add too many json objects
* at once. */
r = json_append(&v, JSON_BUILD_OBJECT(
r = json_variant_merge_objectb(
&v, JSON_BUILD_OBJECT(
JSON_BUILD_PAIR("isReported", JSON_BUILD_BOOLEAN(e->reported_by_loader)),
JSON_BUILD_PAIR_CONDITION(e->tries_left != UINT_MAX, "triesLeft", JSON_BUILD_UNSIGNED(e->tries_left)),
JSON_BUILD_PAIR_CONDITION(e->tries_done != UINT_MAX, "triesDone", JSON_BUILD_UNSIGNED(e->tries_done)),
+4 -4
View File
@@ -403,7 +403,7 @@ static int parse_package_metadata(const char *name, JsonVariant *id_json, Elf *e
/* If we have a build-id, merge it in the same JSON object so that it appears all
* nicely together in the logs/metadata. */
if (id_json) {
r = json_variant_merge(&v, id_json);
r = json_variant_merge_object(&v, id_json);
if (r < 0)
return log_error_errno(r, "json_variant_merge of package meta with buildId failed: %m");
}
@@ -419,7 +419,7 @@ static int parse_package_metadata(const char *name, JsonVariant *id_json, Elf *e
if (r < 0)
return log_error_errno(r, "Failed to build JSON object: %m");
r = json_variant_merge(c->package_metadata, w);
r = json_variant_merge_object(c->package_metadata, w);
if (r < 0)
return log_error_errno(r, "json_variant_merge of package meta with buildId failed: %m");
@@ -712,7 +712,7 @@ static int parse_elf(int fd, const char *executable, char **ret, JsonVariant **r
if (r < 0)
return log_warning_errno(r, "Failed to build JSON object: %m");
r = json_variant_merge(&elf_metadata, json_architecture);
r = json_variant_merge_object(&elf_metadata, json_architecture);
if (r < 0)
return log_warning_errno(r, "Failed to merge JSON objects: %m");
@@ -722,7 +722,7 @@ static int parse_elf(int fd, const char *executable, char **ret, JsonVariant **r
#endif
/* We always at least have the ELF type, so merge that (and possibly the arch). */
r = json_variant_merge(&elf_metadata, package_metadata);
r = json_variant_merge_object(&elf_metadata, package_metadata);
if (r < 0)
return log_warning_errno(r, "Failed to merge JSON objects: %m");
+43 -25
View File
@@ -1958,6 +1958,20 @@ int json_variant_set_field(JsonVariant **v, const char *field, JsonVariant *valu
return 1;
}
int json_variant_set_fieldb(JsonVariant **v, const char *field, ...) {
_cleanup_(json_variant_unrefp) JsonVariant *w = NULL;
va_list ap;
int r;
va_start(ap, field);
r = json_buildv(&w, ap);
va_end(ap);
if (r < 0)
return r;
return json_variant_set_field(v, field, w);
}
int json_variant_set_field_string(JsonVariant **v, const char *field, const char *value) {
_cleanup_(json_variant_unrefp) JsonVariant *m = NULL;
int r;
@@ -2013,7 +2027,7 @@ int json_variant_set_field_strv(JsonVariant **v, const char *field, char **l) {
return json_variant_set_field(v, field, m);
}
int json_variant_merge(JsonVariant **v, JsonVariant *m) {
int json_variant_merge_object(JsonVariant **v, JsonVariant *m) {
_cleanup_(json_variant_unrefp) JsonVariant *w = NULL;
_cleanup_free_ JsonVariant **array = NULL;
size_t v_elements, m_elements, k;
@@ -2076,6 +2090,20 @@ int json_variant_merge(JsonVariant **v, JsonVariant *m) {
return 1;
}
int json_variant_merge_objectb(JsonVariant **v, ...) {
_cleanup_(json_variant_unrefp) JsonVariant *w = NULL;
va_list ap;
int r;
va_start(ap, v);
r = json_buildv(&w, ap);
va_end(ap);
if (r < 0)
return r;
return json_variant_merge_object(v, w);
}
int json_variant_append_array(JsonVariant **v, JsonVariant *element) {
_cleanup_(json_variant_unrefp) JsonVariant *nv = NULL;
bool blank;
@@ -2141,6 +2169,20 @@ int json_variant_append_array(JsonVariant **v, JsonVariant *element) {
return 0;
}
int json_variant_append_arrayb(JsonVariant **v, ...) {
_cleanup_(json_variant_unrefp) JsonVariant *w = NULL;
va_list ap;
int r;
va_start(ap, v);
r = json_buildv(&w, ap);
va_end(ap);
if (r < 0)
return r;
return json_variant_append_array(v, w);
}
JsonVariant *json_variant_find(JsonVariant *haystack, JsonVariant *needle) {
JsonVariant *i;
@@ -4223,30 +4265,6 @@ int json_build(JsonVariant **ret, ...) {
return r;
}
int json_appendv(JsonVariant **v, va_list ap) {
_cleanup_(json_variant_unrefp) JsonVariant *w = NULL;
int r;
assert(v);
r = json_buildv(&w, ap);
if (r < 0)
return r;
return json_variant_merge(v, w);
}
int json_append(JsonVariant **v, ...) {
va_list ap;
int r;
va_start(ap, v);
r = json_appendv(v, ap);
va_end(ap);
return r;
}
int json_log_internal(
JsonVariant *variant,
int level,
+4 -4
View File
@@ -204,6 +204,7 @@ int json_variant_dump(JsonVariant *v, JsonFormatFlags flags, FILE *f, const char
int json_variant_filter(JsonVariant **v, char **to_remove);
int json_variant_set_field(JsonVariant **v, const char *field, JsonVariant *value);
int json_variant_set_fieldb(JsonVariant **v, const char *field, ...);
int json_variant_set_field_string(JsonVariant **v, const char *field, const char *value);
int json_variant_set_field_integer(JsonVariant **v, const char *field, int64_t value);
int json_variant_set_field_unsigned(JsonVariant **v, const char *field, uint64_t value);
@@ -213,9 +214,11 @@ int json_variant_set_field_strv(JsonVariant **v, const char *field, char **l);
JsonVariant *json_variant_find(JsonVariant *haystack, JsonVariant *needle);
int json_variant_append_array(JsonVariant **v, JsonVariant *element);
int json_variant_append_arrayb(JsonVariant **v, ...);
int json_variant_append_array_nodup(JsonVariant **v, JsonVariant *element);
int json_variant_merge(JsonVariant **v, JsonVariant *m);
int json_variant_merge_object(JsonVariant **v, JsonVariant *m);
int json_variant_merge_objectb(JsonVariant **v, ...);
int json_variant_strv(JsonVariant *v, char ***ret);
@@ -349,9 +352,6 @@ enum {
int json_build(JsonVariant **ret, ...);
int json_buildv(JsonVariant **ret, va_list ap);
/* These two functions below are equivalent to json_build() (or json_buildv()) and json_variant_merge(). */
int json_append(JsonVariant **v, ...);
int json_appendv(JsonVariant **v, va_list ap);
/* A bitmask of flags used by the dispatch logic. Note that this is a combined bit mask, that is generated from the bit
* mask originally passed into json_dispatch(), the individual bitmask associated with the static JsonDispatch callout
+2 -2
View File
@@ -64,7 +64,7 @@ static int load_user(
else if (r < 0)
return r;
else {
r = json_variant_merge(&v, privileged_v);
r = json_variant_merge_object(&v, privileged_v);
if (r < 0)
return r;
@@ -208,7 +208,7 @@ static int load_group(
else if (r < 0)
return r;
else {
r = json_variant_merge(&v, privileged_v);
r = json_variant_merge_object(&v, privileged_v);
if (r < 0)
return r;
+4 -4
View File
@@ -648,7 +648,7 @@ TEST(variant) {
test_variant_one("[ 0, -0, 0.0, -0.0, 0.000, -0.000, 0e0, -0e0, 0e+0, -0e-0, 0e-0, -0e000, 0e+000 ]", test_zeroes);
}
TEST(json_append) {
TEST(json_variant_merge_objectb) {
_cleanup_(json_variant_unrefp) JsonVariant *v = NULL, *w = NULL;
assert_se(json_build(&v, JSON_BUILD_OBJECT(
@@ -656,9 +656,9 @@ TEST(json_append) {
JSON_BUILD_PAIR("c", JSON_BUILD_CONST_STRING("y")),
JSON_BUILD_PAIR("a", JSON_BUILD_CONST_STRING("z")))) >= 0);
assert_se(json_append(&w, JSON_BUILD_OBJECT(JSON_BUILD_PAIR("b", JSON_BUILD_STRING("x")))) >= 0);
assert_se(json_append(&w, JSON_BUILD_OBJECT(JSON_BUILD_PAIR("c", JSON_BUILD_STRING("y")))) >= 0);
assert_se(json_append(&w, JSON_BUILD_OBJECT(JSON_BUILD_PAIR("a", JSON_BUILD_STRING("z")))) >= 0);
assert_se(json_variant_merge_objectb(&w, JSON_BUILD_OBJECT(JSON_BUILD_PAIR("b", JSON_BUILD_STRING("x")))) >= 0);
assert_se(json_variant_merge_objectb(&w, JSON_BUILD_OBJECT(JSON_BUILD_PAIR("c", JSON_BUILD_STRING("y")))) >= 0);
assert_se(json_variant_merge_objectb(&w, JSON_BUILD_OBJECT(JSON_BUILD_PAIR("a", JSON_BUILD_STRING("z")))) >= 0);
assert_se(json_variant_equal(v, w));
}