summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2018-10-27 12:02:02 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2018-10-29 15:07:35 +0100
commit7a6f12d75034fed940ce635e76a13123430f088e (patch)
treef58e0e41f725ae50820889fcc55712b13da6ac55
parent3c69cf7603534ef6df01ec079c6a4d3d3382f580 (diff)
src: add nft_ctx_output_{get,set}_json() to nft_ctx_output_{get,set}_flags
Add NFT_CTX_OUTPUT_JSON flag and display output in json format. Acked-by: Phil Sutter <phil@nwl.cc> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r--doc/libnftables.adoc18
-rw-r--r--include/nftables.h6
-rw-r--r--include/nftables/libnftables.h3
-rw-r--r--src/libnftables.c24
-rw-r--r--src/main.c4
-rw-r--r--src/monitor.c2
-rw-r--r--src/rule.c2
7 files changed, 20 insertions, 39 deletions
diff --git a/doc/libnftables.adoc b/doc/libnftables.adoc
index dbd38bdd..b385567c 100644
--- a/doc/libnftables.adoc
+++ b/doc/libnftables.adoc
@@ -31,9 +31,6 @@ void nft_ctx_output_set_debug(struct nft_ctx* '\*ctx'*, unsigned int* 'mask'*);
bool nft_ctx_output_get_echo(struct nft_ctx* '\*ctx'*);
void nft_ctx_output_set_echo(struct nft_ctx* '\*ctx'*, bool* 'val'*);
-bool nft_ctx_output_get_json(struct nft_ctx* '\*ctx'*);
-void nft_ctx_output_set_json(struct nft_ctx* '\*ctx'*, bool* 'val'*);
-
FILE *nft_ctx_set_output(struct nft_ctx* '\*ctx'*, FILE* '\*fp'*);
int nft_ctx_buffer_output(struct nft_ctx* '\*ctx'*);
int nft_ctx_unbuffer_output(struct nft_ctx* '\*ctx'*);
@@ -94,6 +91,7 @@ enum {
NFT_CTX_OUTPUT_SERVICE = (1 << 1),
NFT_CTX_OUTPUT_STATELESS = (1 << 2),
NFT_CTX_OUTPUT_HANDLE = (1 << 3),
+ NFT_CTX_OUTPUT_JSON = (1 << 4),
};
----
@@ -109,6 +107,10 @@ NFT_CTX_OUTPUT_HANDLE::
For example, when deleting a table or chain, it may be identified either by name or handle.
Rules on the other hand must be deleted by handle because there is no other way to uniquely identify them.
This flag makes ruleset listings include handle values.
+NFT_CTX_OUTPUT_JSON::
+ If enabled at compile-time, libnftables accepts input in JSON format and is able to print output in JSON format as well.
+See *libnftables-json*(5) for a description of the supported schema.
+This flag controls JSON output format, input is auto-detected.
The *nft_ctx_output_get_flags*() function returns the output flags setting's value in 'ctx'.
@@ -190,16 +192,6 @@ The *nft_ctx_output_get_echo*() function returns the echo output setting's value
The *nft_ctx_output_set_echo*() function sets the echo output setting in 'ctx' to the value of 'val'.
-=== nft_ctx_output_get_json() and nft_ctx_output_set_json()
-If enabled at compile-time, libnftables accepts input in JSON format and is able to print output in JSON format as well.
-See *libnftables-json*(5) for a description of the supported schema.
-These functions control JSON output format, input is auto-detected.
-The default setting is *false*.
-
-The *nft_ctx_output_get_json*() function returns the JSON output setting's value in 'ctx'.
-
-The *nft_ctx_output_set_json*() function sets the JSON output setting in 'ctx' to the value of 'val'.
-
=== Controlling library standard and error output
By default, any output from the library (e.g., after a *list* command) is written to 'stdout' and any error messages are written to 'stderr'.
To give applications control over them, there are functions to assign custom file pointers as well as having the library buffer what would be written for later retrieval in a static buffer.
diff --git a/include/nftables.h b/include/nftables.h
index e0e7a113..86788a43 100644
--- a/include/nftables.h
+++ b/include/nftables.h
@@ -19,7 +19,6 @@ struct output_ctx {
unsigned int flags;
unsigned int numeric;
unsigned int echo;
- unsigned int json;
union {
FILE *output_fp;
struct cookie output_cookie;
@@ -50,6 +49,11 @@ static inline bool nft_output_handle(const struct output_ctx *octx)
return octx->flags & NFT_CTX_OUTPUT_HANDLE;
}
+static inline bool nft_output_json(const struct output_ctx *octx)
+{
+ return octx->flags & NFT_CTX_OUTPUT_JSON;
+}
+
struct nft_cache {
uint16_t genid;
struct list_head list;
diff --git a/include/nftables/libnftables.h b/include/nftables/libnftables.h
index a6ce9383..35374072 100644
--- a/include/nftables/libnftables.h
+++ b/include/nftables/libnftables.h
@@ -49,6 +49,7 @@ enum {
NFT_CTX_OUTPUT_SERVICE = (1 << 1),
NFT_CTX_OUTPUT_STATELESS = (1 << 2),
NFT_CTX_OUTPUT_HANDLE = (1 << 3),
+ NFT_CTX_OUTPUT_JSON = (1 << 4),
};
unsigned int nft_ctx_output_get_flags(struct nft_ctx *ctx);
@@ -60,8 +61,6 @@ unsigned int nft_ctx_output_get_debug(struct nft_ctx *ctx);
void nft_ctx_output_set_debug(struct nft_ctx *ctx, unsigned int mask);
bool nft_ctx_output_get_echo(struct nft_ctx *ctx);
void nft_ctx_output_set_echo(struct nft_ctx *ctx, bool val);
-bool nft_ctx_output_get_json(struct nft_ctx *ctx);
-void nft_ctx_output_set_json(struct nft_ctx *ctx, bool val);
FILE *nft_ctx_set_output(struct nft_ctx *ctx, FILE *fp);
int nft_ctx_buffer_output(struct nft_ctx *ctx);
diff --git a/src/libnftables.c b/src/libnftables.c
index 6dc1be3d..ff7a53d2 100644
--- a/src/libnftables.c
+++ b/src/libnftables.c
@@ -352,22 +352,6 @@ void nft_ctx_output_set_echo(struct nft_ctx *ctx, bool val)
ctx->output.echo = val;
}
-bool nft_ctx_output_get_json(struct nft_ctx *ctx)
-{
-#ifdef HAVE_LIBJANSSON
- return ctx->output.json;
-#else
- return false;
-#endif
-}
-
-void nft_ctx_output_set_json(struct nft_ctx *ctx, bool val)
-{
-#ifdef HAVE_LIBJANSSON
- ctx->output.json = val;
-#endif
-}
-
static const struct input_descriptor indesc_cmdline = {
.type = INDESC_BUFFER,
.name = "<cmdline>",
@@ -425,7 +409,7 @@ int nft_run_cmd_from_buffer(struct nft_ctx *nft, const char *buf)
nlbuf = xzalloc(strlen(buf) + 2);
sprintf(nlbuf, "%s\n", buf);
- if (nft->output.json)
+ if (nft_output_json(&nft->output))
rc = nft_parse_json_buffer(nft, nlbuf, &msgs, &cmds);
if (rc == -EINVAL)
rc = nft_parse_bison_buffer(nft, nlbuf, &msgs, &cmds);
@@ -447,7 +431,7 @@ err:
}
free(nlbuf);
- if (!rc && nft->output.json && nft->output.echo)
+ if (!rc && nft_output_json(&nft->output) && nft->output.echo)
json_print_echo(nft);
return rc;
}
@@ -467,7 +451,7 @@ int nft_run_cmd_from_filename(struct nft_ctx *nft, const char *filename)
filename = "/dev/stdin";
rc = -EINVAL;
- if (nft->output.json)
+ if (nft_output_json(&nft->output))
rc = nft_parse_json_filename(nft, filename, &msgs, &cmds);
if (rc == -EINVAL)
rc = nft_parse_bison_filename(nft, filename, &msgs, &cmds);
@@ -488,7 +472,7 @@ err:
nft->scanner = NULL;
}
- if (!rc && nft->output.json && nft->output.echo)
+ if (!rc && nft_output_json(&nft->output) && nft->output.echo)
json_print_echo(nft);
return rc;
}
diff --git a/src/main.c b/src/main.c
index 7cf3bb68..33e3bc6e 100644
--- a/src/main.c
+++ b/src/main.c
@@ -272,7 +272,9 @@ int main(int argc, char * const *argv)
nft_ctx_output_set_echo(nft, true);
break;
case OPT_JSON:
- nft_ctx_output_set_json(nft, true);
+#ifdef HAVE_LIBJANSSON
+ output_flags |= NFT_CTX_OUTPUT_JSON;
+#endif
break;
case OPT_INVALID:
exit(EXIT_FAILURE);
diff --git a/src/monitor.c b/src/monitor.c
index 9e3c43dc..01480cd7 100644
--- a/src/monitor.c
+++ b/src/monitor.c
@@ -908,7 +908,7 @@ int netlink_echo_callback(const struct nlmsghdr *nlh, void *data)
if (!echo_monh.ctx->nft->output.echo)
return MNL_CB_OK;
- if (ctx->nft->output.json)
+ if (nft_output_json(&ctx->nft->output))
return json_events_cb(nlh, &echo_monh);
return netlink_events_cb(nlh, &echo_monh);
diff --git a/src/rule.c b/src/rule.c
index da1bdc44..86b68cb8 100644
--- a/src/rule.c
+++ b/src/rule.c
@@ -2127,7 +2127,7 @@ static int do_command_list(struct netlink_ctx *ctx, struct cmd *cmd)
{
struct table *table = NULL;
- if (ctx->nft->output.json)
+ if (nft_output_json(&ctx->nft->output))
return do_command_list_json(ctx, cmd);
if (cmd->handle.table.name != NULL)