From: Lennart Poettering Date: Thu, 24 Aug 2023 07:55:48 +0000 (+0200) Subject: json: add json_variant_set_fieldb() helper X-Git-Tag: v255-rc1~654^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f5fc7732b0663616d237a04410a70490e456a662;p=thirdparty%2Fsystemd.git json: add json_variant_set_fieldb() helper Let's a "b" helper for json_variant_set_field() that combines json_build() with json_variant_set_field(), similar to the json_variant_merge_objectb(), json_variant_append_arrayb(). --- diff --git a/src/home/homectl.c b/src/home/homectl.c index b1211451970..56b3de4a95d 100644 --- a/src/home/homectl.c +++ b/src/home/homectl.c @@ -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)); diff --git a/src/home/user-record-sign.c b/src/home/user-record-sign.c index cabeb71f2ec..cf72eaa5567 100644 --- a/src/home/user-record-sign.c +++ b/src/home/user-record-sign.c @@ -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; diff --git a/src/shared/json.c b/src/shared/json.c index 311b05441b3..e17f89564d6 100644 --- a/src/shared/json.c +++ b/src/shared/json.c @@ -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; diff --git a/src/shared/json.h b/src/shared/json.h index 1fe67d820b8..1700d1d8fa2 100644 --- a/src/shared/json.h +++ b/src/shared/json.h @@ -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);