summaryrefslogtreecommitdiffstats
path: root/src/json.c
diff options
context:
space:
mode:
authorPhil Sutter <phil@nwl.cc>2018-08-29 16:23:28 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2018-08-30 12:19:36 +0200
commit49e0f1dc6e52e791f5e0ba21097aea17d5950d38 (patch)
tree00215046781f409c62974cd57bf75f96ad265a51 /src/json.c
parent90d4ee087171e75d5313359ad6b6f1341e51ddc5 (diff)
JSON: Add metainfo object to all output
Right now this object merely contains the nftables version and release name as well as a JSON schema version, but it could be extended arbitrarily. In the future, this will also allow for non-compatible schema changes should the need for this arise. Adjust the parser to accept metainfo objects and make it verify json_schema_version to be less than or equal to the one hard-coded in the library. Signed-off-by: Phil Sutter <phil@nwl.cc> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/json.c')
-rw-r--r--src/json.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/json.c b/src/json.c
index 2a13dfe7..84bdaa39 100644
--- a/src/json.c
+++ b/src/json.c
@@ -1530,6 +1530,14 @@ static json_t *do_list_flowtables_json(struct netlink_ctx *ctx, struct cmd *cmd)
return root;
}
+static json_t *generate_json_metainfo(void)
+{
+ return json_pack("{s: {s:s, s:s, s:i}}", "metainfo",
+ "version", PACKAGE_VERSION,
+ "release_name", RELEASE_NAME,
+ "json_schema_version", JSON_SCHEMA_VERSION);
+}
+
int do_command_list_json(struct netlink_ctx *ctx, struct cmd *cmd)
{
struct table *table = NULL;
@@ -1596,10 +1604,15 @@ int do_command_list_json(struct netlink_ctx *ctx, struct cmd *cmd)
BUG("invalid command object type %u\n", cmd->obj);
}
- if (json_is_array(root) && !json_array_size(root)) {
- json_decref(root);
- root = json_null();
+ if (!json_is_array(root)) {
+ json_t *tmp = json_array();
+
+ json_array_append_new(tmp, root);
+ root = tmp;
}
+
+ json_array_insert_new(root, 0, generate_json_metainfo());
+
root = json_pack("{s:o}", "nftables", root);
json_dumpf(root, ctx->octx->output_fp, 0);
json_decref(root);