assert(parameters);
- r = json_dispatch(parameters, dispatch_table, NULL, 0, &p);
- if (r < 0)
+ r = varlink_dispatch(link, parameters, dispatch_table, &p);
+ if (r != 0)
return r;
if (!streq_ptr(p.service, "io.systemd.DynamicUser"))
assert(parameters);
- r = json_dispatch(parameters, dispatch_table, NULL, 0, &p);
- if (r < 0)
+ r = varlink_dispatch(link, parameters, dispatch_table, &p);
+ if (r != 0)
return r;
if (!streq_ptr(p.service, "io.systemd.DynamicUser"))
assert(parameters);
- r = json_dispatch(parameters, dispatch_table, NULL, 0, &p);
- if (r < 0)
+ r = varlink_dispatch(link, parameters, dispatch_table, &p);
+ if (r != 0)
return r;
if (!streq_ptr(p.service, "io.systemd.DynamicUser"))
if (r < 0)
return 0;
- r = json_dispatch(v, data_dispatch, NULL, 0, &config);
+ r = json_dispatch(v, data_dispatch, 0, &config);
if (r < 0)
return 0;
if (!e)
return log_oom();
- r = json_dispatch(v, dispatch_table, NULL, JSON_LOG, e);
+ r = json_dispatch(v, dispatch_table, JSON_LOG, e);
if (r < 0)
return r;
assert(parameters);
- r = json_dispatch(parameters, dispatch_table, NULL, 0, &p);
- if (r < 0)
+ r = varlink_dispatch(link, parameters, dispatch_table, &p);
+ if (r != 0)
return r;
if (!streq_ptr(p.service, m->userdb_service))
assert(parameters);
- r = json_dispatch(parameters, dispatch_table, NULL, 0, &p);
- if (r < 0)
+ r = varlink_dispatch(link, parameters, dispatch_table, &p);
+ if (r != 0)
return r;
if (!streq_ptr(p.service, m->userdb_service))
assert(parameters);
- r = json_dispatch(parameters, dispatch_table, NULL, 0, &p);
- if (r < 0)
+ r = varlink_dispatch(link, parameters, dispatch_table, &p);
+ if (r != 0)
return r;
if (!streq_ptr(p.service, m->userdb_service))
assert(parameters);
- r = json_dispatch(parameters, dispatch_table, NULL, 0, &p);
- if (r < 0)
+ r = varlink_dispatch(link, parameters, dispatch_table, &p);
+ if (r != 0)
return r;
if (!streq_ptr(p.service, "io.systemd.Machine"))
assert(parameters);
- r = json_dispatch(parameters, dispatch_table, NULL, 0, &p);
- if (r < 0)
+ r = varlink_dispatch(link, parameters, dispatch_table, &p);
+ if (r != 0)
return r;
if (!streq_ptr(p.service, "io.systemd.Machine"))
assert(parameters);
- r = json_dispatch(parameters, dispatch_table, NULL, 0, &p);
- if (r < 0)
+ r = varlink_dispatch(link, parameters, dispatch_table, &p);
+ if (r != 0)
return r;
if (!streq_ptr(p.service, "io.systemd.Machine"))
"Unexpected OCI element '%s' of type '%s'.", name, json_variant_type_to_string(json_variant_type(v)));
}
+static int oci_dispatch(JsonVariant *v, const JsonDispatch table[], JsonDispatchFlags flags, void *userdata) {
+ return json_dispatch_full(v, table, oci_unexpected, flags, userdata, /* reterr_bad_field= */ NULL);
+}
+
static int oci_unsupported(const char *name, JsonVariant *v, JsonDispatchFlags flags, void *userdata) {
return json_log(v, flags, SYNTHETIC_ERRNO(EOPNOTSUPP),
"Unsupported OCI element '%s' of type '%s'.", name, json_variant_type_to_string(json_variant_type(v)));
{}
};
- return json_dispatch(v, table, oci_unexpected, flags, s);
+ return oci_dispatch(v, table, flags, s);
}
static int oci_absolute_path(const char *name, JsonVariant *v, JsonDispatchFlags flags, void *userdata) {
{}
};
- r = json_dispatch(e, table, oci_unexpected, flags, &data);
+ r = oci_dispatch(e, table, flags, &data);
if (r < 0)
return r;
Settings *s = ASSERT_PTR(userdata);
int r;
- r = json_dispatch(v, table, oci_unexpected, flags, &s->full_capabilities);
+ r = oci_dispatch(v, table, flags, &s->full_capabilities);
if (r < 0)
return r;
{}
};
- return json_dispatch(v, table, oci_unexpected, flags, userdata);
+ return oci_dispatch(v, table, flags, userdata);
}
static int oci_process(const char *name, JsonVariant *v, JsonDispatchFlags flags, void *userdata) {
{}
};
- return json_dispatch(v, table, oci_unexpected, flags, userdata);
+ return oci_dispatch(v, table, flags, userdata);
}
static int oci_root(const char *name, JsonVariant *v, JsonDispatchFlags flags, void *userdata) {
{}
};
- r = json_dispatch(v, table, oci_unexpected, flags, s);
+ r = oci_dispatch(v, table, flags, s);
if (r < 0)
return r;
_cleanup_(oci_mount_data_done) oci_mount_data data = {};
CustomMount *m;
- r = json_dispatch(e, table, oci_unexpected, flags, &data);
+ r = oci_dispatch(e, table, flags, &data);
if (r < 0)
return r;
{}
};
- r = json_dispatch(e, table, oci_unexpected, flags, &data);
+ r = oci_dispatch(e, table, flags, &data);
if (r < 0)
return r;
assert_se(e = json_variant_by_index(v, 0));
- r = json_dispatch(e, table, oci_unexpected, flags, &data);
+ r = oci_dispatch(e, table, flags, &data);
if (r < 0)
return r;
.mode = 0644,
};
- r = json_dispatch(e, table, oci_unexpected, flags, node);
+ r = oci_dispatch(e, table, flags, node);
if (r < 0)
goto fail_element;
{}
};
- r = json_dispatch(e, table, oci_unexpected, flags, &data);
+ r = oci_dispatch(e, table, flags, &data);
if (r < 0)
return r;
Settings *s = ASSERT_PTR(userdata);
int r;
- r = json_dispatch(v, table, oci_unexpected, flags, &data);
+ r = oci_dispatch(v, table, flags, &data);
if (r < 0)
return r;
Settings *s = ASSERT_PTR(userdata);
int r;
- r = json_dispatch(v, table, oci_unexpected, flags, &data);
+ r = oci_dispatch(v, table, flags, &data);
if (r < 0) {
cpu_set_reset(&data.cpu_set);
return r;
_cleanup_free_ char *path = NULL;
- r = json_dispatch(e, table, oci_unexpected, flags, &data);
+ r = oci_dispatch(e, table, flags, &data);
if (r < 0)
return r;
_cleanup_free_ char *path = NULL;
- r = json_dispatch(e, table, oci_unexpected, flags, &data);
+ r = oci_dispatch(e, table, flags, &data);
if (r < 0)
return r;
{}
};
- return json_dispatch(v, table, oci_unexpected, flags, userdata);
+ return oci_dispatch(v, table, flags, userdata);
}
static int oci_cgroup_pids(const char *name, JsonVariant *v, JsonDispatchFlags flags, void *userdata) {
uint64_t m;
int r;
- r = json_dispatch(v, table, oci_unexpected, flags, &k);
+ r = oci_dispatch(v, table, flags, &k);
if (r < 0)
return r;
{}
};
- return json_dispatch(v, table, oci_unexpected, flags, userdata);
+ return oci_dispatch(v, table, flags, userdata);
}
static bool sysctl_key_valid(const char *s) {
.op = 0,
};
- r = json_dispatch(e, table, oci_unexpected, flags, p);
+ r = oci_dispatch(e, table, flags, p);
if (r < 0)
return r;
.action = UINT32_MAX,
};
- r = json_dispatch(e, table, oci_unexpected, flags, &rule);
+ r = oci_dispatch(e, table, flags, &rule);
if (r < 0)
return r;
if (!sc)
return json_log(v, flags, SYNTHETIC_ERRNO(ENOMEM), "Couldn't allocate seccomp object.");
- r = json_dispatch(v, table, oci_unexpected, flags, sc);
+ r = oci_dispatch(v, table, flags, sc);
if (r < 0)
return r;
{}
};
- return json_dispatch(v, table, oci_unexpected, flags, userdata);
+ return oci_dispatch(v, table, flags, userdata);
}
static int oci_hook_timeout(const char *name, JsonVariant *v, JsonDispatchFlags flags, void *userdata) {
.timeout = USEC_INFINITY,
};
- r = json_dispatch(e, table, oci_unexpected, flags, new_item);
+ r = oci_dispatch(e, table, flags, new_item);
if (r < 0) {
free(new_item->path);
strv_free(new_item->args);
{}
};
- return json_dispatch(v, table, oci_unexpected, flags, userdata);
+ return oci_dispatch(v, table, flags, userdata);
}
static int oci_annotations(const char *name, JsonVariant *v, JsonDispatchFlags flags, void *userdata) {
if (!s->bundle)
return log_oom();
- r = json_dispatch(oci, table, oci_unexpected, 0, s);
+ r = oci_dispatch(oci, table, 0, s);
if (r < 0)
return r;
goto not_found;
}
- r = json_dispatch(rparams, resolve_hostname_reply_dispatch_table, NULL, json_dispatch_flags, &p);
+ r = json_dispatch(rparams, resolve_hostname_reply_dispatch_table, json_dispatch_flags, &p);
if (r < 0)
goto fail;
if (json_variant_is_blank_object(p.addresses))
JSON_VARIANT_ARRAY_FOREACH(entry, p.addresses) {
AddressParameters q = {};
- r = json_dispatch(entry, address_parameters_dispatch_table, NULL, json_dispatch_flags, &q);
+ r = json_dispatch(entry, address_parameters_dispatch_table, json_dispatch_flags, &q);
if (r < 0)
goto fail;
JSON_VARIANT_ARRAY_FOREACH(entry, p.addresses) {
AddressParameters q = {};
- r = json_dispatch(entry, address_parameters_dispatch_table, NULL, json_dispatch_flags, &q);
+ r = json_dispatch(entry, address_parameters_dispatch_table, json_dispatch_flags, &q);
if (r < 0)
goto fail;
goto not_found;
}
- r = json_dispatch(rparams, resolve_hostname_reply_dispatch_table, NULL, json_dispatch_flags, &p);
+ r = json_dispatch(rparams, resolve_hostname_reply_dispatch_table, json_dispatch_flags, &p);
if (r < 0)
goto fail;
if (json_variant_is_blank_object(p.addresses))
JSON_VARIANT_ARRAY_FOREACH(entry, p.addresses) {
AddressParameters q = {};
- r = json_dispatch(entry, address_parameters_dispatch_table, NULL, json_dispatch_flags, &q);
+ r = json_dispatch(entry, address_parameters_dispatch_table, json_dispatch_flags, &q);
if (r < 0)
goto fail;
JSON_VARIANT_ARRAY_FOREACH(entry, p.addresses) {
AddressParameters q = {};
- r = json_dispatch(entry, address_parameters_dispatch_table, NULL, json_dispatch_flags, &q);
+ r = json_dispatch(entry, address_parameters_dispatch_table, json_dispatch_flags, &q);
if (r < 0)
goto fail;
goto not_found;
}
- r = json_dispatch(rparams, resolve_address_reply_dispatch_table, NULL, json_dispatch_flags, &p);
+ r = json_dispatch(rparams, resolve_address_reply_dispatch_table, json_dispatch_flags, &p);
if (r < 0)
goto fail;
if (json_variant_is_blank_object(p.names))
JSON_VARIANT_ARRAY_FOREACH(entry, p.names) {
_cleanup_(name_parameters_destroy) NameParameters q = {};
- r = json_dispatch(entry, name_parameters_dispatch_table, NULL, json_dispatch_flags, &q);
+ r = json_dispatch(entry, name_parameters_dispatch_table, json_dispatch_flags, &q);
if (r < 0)
goto fail;
JSON_VARIANT_ARRAY_FOREACH(entry, p.names) {
_cleanup_(name_parameters_destroy) NameParameters q = {};
- r = json_dispatch(entry, name_parameters_dispatch_table, NULL, json_dispatch_flags, &q);
+ r = json_dispatch(entry, name_parameters_dispatch_table, json_dispatch_flags, &q);
if (r < 0)
goto fail;
if (!json_variant_is_object(c))
continue;
- r = json_dispatch(c, dispatch_table, NULL, 0, &message);
+ r = json_dispatch(c, dispatch_table, 0, &message);
if (r == -ENOMEM)
return r;
if (r < 0)
assert(link);
- r = json_dispatch(parameters, dispatch_table, NULL, 0, &p);
- if (r < 0)
+ r = varlink_dispatch(link, parameters, dispatch_table, &p);
+ if (r != 0)
return r;
if (!TPM2_PCR_INDEX_VALID(p.pcr))
{},
};
- r = json_dispatch(reply, statistics_dispatch_table, NULL, JSON_LOG, &statistics);
+ r = json_dispatch(reply, statistics_dispatch_table, JSON_LOG, &statistics);
if (r < 0)
return r;
{},
};
- r = json_dispatch(statistics.transactions, transactions_dispatch_table, NULL, JSON_LOG, &transactions);
+ r = json_dispatch(statistics.transactions, transactions_dispatch_table, JSON_LOG, &transactions);
if (r < 0)
return r;
{},
};
- r = json_dispatch(statistics.cache, cache_dispatch_table, NULL, JSON_LOG, &cache);
+ r = json_dispatch(statistics.cache, cache_dispatch_table, JSON_LOG, &cache);
if (r < 0)
return r;
{},
};
- r = json_dispatch(statistics.dnssec, dnssec_dispatch_table, NULL, JSON_LOG, &dnsssec);
+ r = json_dispatch(statistics.dnssec, dnssec_dispatch_table, JSON_LOG, &dnsssec);
if (r < 0)
return r;
{}
};
- r = json_dispatch(v, dispatch_table, NULL, 0, NULL);
+ r = json_dispatch(v, dispatch_table, 0, NULL);
if (r < 0)
return (void) log_warning("Received malformed monitor message, ignoring.");
_cleanup_(dns_resource_key_unrefp) DnsResourceKey *k = NULL;
int r, c = 0;
- r = json_dispatch(item, dispatch_table, NULL, JSON_LOG, &item_info);
+ r = json_dispatch(item, dispatch_table, JSON_LOG, &item_info);
if (r < 0)
return r;
{},
};
- r = json_dispatch(scope, dispatch_table, NULL, JSON_LOG, &scope_info);
+ r = json_dispatch(scope, dispatch_table, JSON_LOG, &scope_info);
if (r < 0)
return r;
{},
};
- r = json_dispatch(server, dispatch_table, NULL, JSON_LOG|JSON_PERMISSIVE, &server_state);
+ r = json_dispatch(server, dispatch_table, JSON_LOG|JSON_PERMISSIVE, &server_state);
if (r < 0)
return r;
assert(v);
assert(ret);
- r = json_dispatch(v, dispatch_table, NULL, 0, NULL);
+ r = json_dispatch(v, dispatch_table, 0, NULL);
if (r < 0)
return r;
if (FLAGS_SET(flags, VARLINK_METHOD_ONEWAY))
return -EINVAL;
- r = json_dispatch(parameters, dispatch_table, NULL, 0, &p);
- if (r < 0)
+ r = varlink_dispatch(link, parameters, dispatch_table, &p);
+ if (r != 0)
return r;
if (p.ifindex < 0)
if (FLAGS_SET(flags, VARLINK_METHOD_ONEWAY))
return -EINVAL;
- r = json_dispatch(parameters, dispatch_table, NULL, 0, &p);
- if (r < 0)
+ r = varlink_dispatch(link, parameters, dispatch_table, &p);
+ if (r != 0)
return r;
if (p.ifindex < 0)
{},
};
- return json_dispatch(variant, privileged_dispatch_table, NULL, flags, userdata);
+ return json_dispatch(variant, privileged_dispatch_table, flags, userdata);
}
static int dispatch_binding(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata) {
if (!m)
return 0;
- return json_dispatch(m, binding_dispatch_table, NULL, flags, userdata);
+ return json_dispatch(m, binding_dispatch_table, flags, userdata);
}
static int dispatch_per_machine(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata) {
if (!matching)
continue;
- r = json_dispatch(e, per_machine_dispatch_table, NULL, flags, userdata);
+ r = json_dispatch(e, per_machine_dispatch_table, flags, userdata);
if (r < 0)
return r;
}
if (!m)
return 0;
- return json_dispatch(m, status_dispatch_table, NULL, flags, userdata);
+ return json_dispatch(m, status_dispatch_table, flags, userdata);
}
static int group_record_augment(GroupRecord *h, JsonDispatchFlags json_flags) {
if (r < 0)
return r;
- r = json_dispatch(h->json, group_dispatch_table, NULL, json_flags, h);
+ r = json_dispatch(h->json, group_dispatch_table, json_flags, h);
if (r < 0)
return r;
return SIZE_TO_PTR(p->offset);
}
-int json_dispatch(JsonVariant *v, const JsonDispatch table[], JsonDispatchCallback bad, JsonDispatchFlags flags, void *userdata) {
+int json_dispatch_full(
+ JsonVariant *v,
+ const JsonDispatch table[],
+ JsonDispatchCallback bad,
+ JsonDispatchFlags flags,
+ void *userdata,
+ const char **reterr_bad_field) {
size_t m;
int r, done = 0;
bool *found;
if (flags & JSON_PERMISSIVE)
return 0;
+ if (reterr_bad_field)
+ *reterr_bad_field = NULL;
+
return -EINVAL;
}
streq_ptr(json_variant_string(key), p->name))
break;
- if (p->name) { /* Found a matching entry! :-) */
+ if (p->name) { /* Found a matching entry! 🙂 */
JsonDispatchFlags merged_flags;
merged_flags = flags | p->flags;
if (merged_flags & JSON_PERMISSIVE)
continue;
+ if (reterr_bad_field)
+ *reterr_bad_field = p->name;
+
return -EINVAL;
}
if (merged_flags & JSON_PERMISSIVE)
continue;
+ if (reterr_bad_field)
+ *reterr_bad_field = p->name;
+
return -ENOTUNIQ;
}
if (merged_flags & JSON_PERMISSIVE)
continue;
+ if (reterr_bad_field)
+ *reterr_bad_field = json_variant_string(key);
+
return r;
}
}
done ++;
- } else { /* Didn't find a matching entry! :-( */
+ } else { /* Didn't find a matching entry! ☹️ */
if (bad) {
r = bad(json_variant_string(key), value, flags, userdata);
if (flags & JSON_PERMISSIVE)
continue;
+ if (reterr_bad_field)
+ *reterr_bad_field = json_variant_string(key);
+
return r;
} else
done ++;
if (flags & JSON_PERMISSIVE)
continue;
+ if (reterr_bad_field)
+ *reterr_bad_field = json_variant_string(key);
+
return -EADDRNOTAVAIL;
}
}
if ((merged_flags & JSON_PERMISSIVE))
continue;
+ if (reterr_bad_field)
+ *reterr_bad_field = p->name;
+
return -ENXIO;
}
}
JsonDispatchFlags flags;
} JsonDispatch;
-int json_dispatch(JsonVariant *v, const JsonDispatch table[], JsonDispatchCallback bad, JsonDispatchFlags flags, void *userdata);
+int json_dispatch_full(JsonVariant *v, const JsonDispatch table[], JsonDispatchCallback bad, JsonDispatchFlags flags, void *userdata, const char **reterr_bad_field);
+
+static inline int json_dispatch(JsonVariant *v, const JsonDispatch table[], JsonDispatchFlags flags, void *userdata) {
+ return json_dispatch_full(v, table, NULL, flags, userdata, NULL);
+}
int json_dispatch_string(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata);
int json_dispatch_const_string(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata);
{},
};
- return json_dispatch(variant, secret_dispatch_table, NULL, flags, userdata);
+ return json_dispatch(variant, secret_dispatch_table, flags, userdata);
}
static int dispatch_pkcs11_uri(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata) {
k = h->pkcs11_encrypted_key + h->n_pkcs11_encrypted_key;
*k = (Pkcs11EncryptedKey) {};
- r = json_dispatch(e, pkcs11_key_dispatch_table, NULL, flags, k);
+ r = json_dispatch(e, pkcs11_key_dispatch_table, flags, k);
if (r < 0) {
pkcs11_encrypted_key_done(k);
return r;
.client_pin = -1,
};
- r = json_dispatch(e, fido2_hmac_salt_dispatch_table, NULL, flags, k);
+ r = json_dispatch(e, fido2_hmac_salt_dispatch_table, flags, k);
if (r < 0) {
fido2_hmac_salt_done(k);
return r;
k = h->recovery_key + h->n_recovery_key;
*k = (RecoveryKey) {};
- r = json_dispatch(e, recovery_key_dispatch_table, NULL, flags, k);
+ r = json_dispatch(e, recovery_key_dispatch_table, flags, k);
if (r < 0) {
recovery_key_done(k);
return r;
{},
};
- return json_dispatch(variant, privileged_dispatch_table, NULL, flags, userdata);
+ return json_dispatch(variant, privileged_dispatch_table, flags, userdata);
}
static int dispatch_binding(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata) {
if (!m)
return 0;
- return json_dispatch(m, binding_dispatch_table, NULL, flags, userdata);
+ return json_dispatch(m, binding_dispatch_table, flags, userdata);
}
int per_machine_id_match(JsonVariant *ids, JsonDispatchFlags flags) {
if (!matching)
continue;
- r = json_dispatch(e, per_machine_dispatch_table, NULL, flags, userdata);
+ r = json_dispatch(e, per_machine_dispatch_table, flags, userdata);
if (r < 0)
return r;
}
if (!m)
return 0;
- return json_dispatch(m, status_dispatch_table, NULL, flags, userdata);
+ return json_dispatch(m, status_dispatch_table, flags, userdata);
}
int user_record_build_image_path(UserStorage storage, const char *user_name_and_realm, char **ret) {
if (r < 0)
return r;
- r = json_dispatch(h->json, user_dispatch_table, NULL, json_flags, h);
+ r = json_dispatch(h->json, user_dispatch_table, json_flags, h);
if (r < 0)
return r;
assert_se(!iterator->found_user);
- r = json_dispatch(parameters, dispatch_table, NULL, 0, &user_data);
+ r = json_dispatch(parameters, dispatch_table, 0, &user_data);
if (r < 0)
goto finish;
assert_se(!iterator->found_group);
- r = json_dispatch(parameters, dispatch_table, NULL, 0, &group_data);
+ r = json_dispatch(parameters, dispatch_table, 0, &group_data);
if (r < 0)
goto finish;
assert(!iterator->found_user_name);
assert(!iterator->found_group_name);
- r = json_dispatch(parameters, dispatch_table, NULL, 0, &membership_data);
+ r = json_dispatch(parameters, dispatch_table, 0, &membership_data);
if (r < 0)
goto finish;
if (json_variant_elements(parameters) != 2)
return varlink_error_invalid_parameter(link, parameters);
- r = json_dispatch(parameters, dispatch_table, NULL, 0, &level);
- if (r < 0)
+ r = varlink_dispatch(link, parameters, dispatch_table, &level);
+ if (r != 0)
return r;
if (LOG_PRI(level) != level)
assert(link);
- r = json_dispatch(parameters, dispatch_table, NULL, 0, &name);
+ r = json_dispatch(parameters, dispatch_table, 0, &name);
if (r < 0)
return r;
return varlink_notify(v, parameters);
}
+int varlink_dispatch(Varlink *v, JsonVariant *parameters, const JsonDispatch table[], void *userdata) {
+ const char *bad_field = NULL;
+ int r;
+
+ assert_return(v, -EINVAL);
+ assert_return(table, -EINVAL);
+
+ /* A wrapper around json_dispatch_full() that returns a nice InvalidParameter error if we hit a problem with some field. */
+
+ r = json_dispatch_full(parameters, table, /* bad= */ NULL, /* flags= */ 0, userdata, &bad_field);
+ if (r < 0) {
+ if (bad_field)
+ return varlink_errorb(v, VARLINK_ERROR_INVALID_PARAMETER,
+ JSON_BUILD_OBJECT(JSON_BUILD_PAIR("parameter", JSON_BUILD_STRING(bad_field))));
+ return r;
+ }
+
+ return 0;
+}
+
int varlink_bind_reply(Varlink *v, VarlinkReply callback) {
assert_return(v, -EINVAL);
int varlink_notify(Varlink *v, JsonVariant *parameters);
int varlink_notifyb(Varlink *v, ...);
+/* Parsing incoming data via json_dispatch() and generate a nice error on parse errors */
+int varlink_dispatch(Varlink *v, JsonVariant *parameters, const JsonDispatch table[], void *userdata);
+
/* Write outgoing fds into the socket (to be associated with the next enqueued message) */
int varlink_push_fd(Varlink *v, int fd);
int varlink_dup_fd(Varlink *v, int fd);
assert(link);
- r = json_dispatch(parameters, dispatch_table, NULL, 0, &p);
- if (r < 0)
+ r = varlink_dispatch(link, parameters, dispatch_table, &p);
+ if (r != 0)
return r;
r = parse_image_class_parameter(link, p.class, &image_class, &hierarchies);
{ "noexec", JSON_VARIANT_BOOLEAN, json_dispatch_boolean, offsetof(MethodMergeParameters, noexec), 0 },
{}
};
- int r;
assert(link);
assert(parameters);
assert(p);
- r = json_dispatch(parameters, dispatch_table, NULL, 0, p);
- if (r < 0)
- return r;
-
- return 0;
+ return varlink_dispatch(link, parameters, dispatch_table, p);
}
static int vl_method_merge(Varlink *link, JsonVariant *parameters, VarlinkMethodFlags flags, void *userdata) {
assert(link);
r = parse_merge_parameters(link, parameters, &p);
- if (r < 0)
+ if (r != 0)
return r;
r = parse_image_class_parameter(link, p.class, &image_class, &hierarchies);
assert(link);
r = parse_merge_parameters(link, parameters, &p);
- if (r < 0)
+ if (r != 0)
return r;
r = parse_image_class_parameter(link, p.class, &image_class, &hierarchies);
assert(link);
- r = json_dispatch(parameters, dispatch_table, NULL, 0, &p);
- if (r < 0)
+ r = varlink_dispatch(link, parameters, dispatch_table, &p);
+ if (r != 0)
return r;
r = parse_image_class_parameter(link, p.class, &image_class, NULL);
};
static const JsonDispatch dispatch_table[] = {
- { "a", JSON_VARIANT_INTEGER, json_dispatch_int, offsetof(struct Something, x), JSON_MANDATORY },
+ { "a", JSON_VARIANT_INTEGER, json_dispatch_int, offsetof(struct Something, x), JSON_MANDATORY },
{ "b", JSON_VARIANT_INTEGER, json_dispatch_int, offsetof(struct Something, y), JSON_MANDATORY},
{}
};
struct Something s = {};
- r = json_dispatch(parameters, dispatch_table, NULL, 0, &s);
+ r = varlink_dispatch(link, parameters, dispatch_table, &s);
+ if (r != 0)
+ return r;
for (int i = 0; i < 5; i++) {
_cleanup_(json_variant_unrefp) JsonVariant *w = NULL;
assert(parameters);
- r = json_dispatch(parameters, dispatch_table, NULL, 0, &p);
- if (r < 0)
+ r = varlink_dispatch(link, parameters, dispatch_table, &p);
+ if (r != 0)
return r;
r = userdb_flags_from_service(link, p.service, &userdb_flags);
assert(parameters);
- r = json_dispatch(parameters, dispatch_table, NULL, 0, &p);
- if (r < 0)
+ r = varlink_dispatch(link, parameters, dispatch_table, &p);
+ if (r != 0)
return r;
r = userdb_flags_from_service(link, p.service, &userdb_flags);
assert(parameters);
- r = json_dispatch(parameters, dispatch_table, NULL, 0, &p);
- if (r < 0)
+ r = varlink_dispatch(link, parameters, dispatch_table, &p);
+ if (r != 0)
return r;
r = userdb_flags_from_service(link, p.service, &userdb_flags);
};
_cleanup_(get_info_data_done) GetInfoData data = {};
- r = json_dispatch(reply, dispatch_table, NULL, JSON_LOG, &data);
+ r = json_dispatch(reply, dispatch_table, JSON_LOG, &data);
if (r < 0)
return r;
const char *description = NULL;
unsigned line = 0, column = 0;
- r = json_dispatch(reply, dispatch_table, NULL, JSON_LOG, &description);
+ r = json_dispatch(reply, dispatch_table, JSON_LOG, &description);
if (r < 0)
return r;