]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
json: add json_variant_set_fieldb() helper 28946/head
authorLennart Poettering <lennart@poettering.net>
Thu, 24 Aug 2023 07:55:48 +0000 (09:55 +0200)
committerLennart Poettering <lennart@poettering.net>
Thu, 24 Aug 2023 11:20:39 +0000 (13:20 +0200)
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().

src/home/homectl.c
src/home/user-record-sign.c
src/shared/json.c
src/shared/json.h

index b12114519708999b78969532918f0e8db20d2e52..56b3de4a95dffb0d0356147411f63e1e30b8f8fb 100644 (file)
@@ -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));
 
index cabeb71f2ec9124d7eb2ff4cbc6ddde43f1abc24..cf72eaa55675c401ec9f54d25bf4d81b133a518d 100644 (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;
 
index 311b05441b338f7b6802a8728d1370c81259496f..e17f89564d64079fea2baa84ca3c7ce29b56b6de 100644 (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;
index 1fe67d820b81a769a89dd6547316cbb57da4e8f0..1700d1d8fa2d56073902802c9d49e838a5399444 100644 (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);