On Mon, Oct 29, 2018 at 12:33:39PM +0100, Pablo Neira Ayuso wrote:
> Add NFT_CTX_OUTPUT_JSON flag and display output in json format.
>
> Signed-off-by: Pablo Neira Ayuso <[email protected]>
> ---
> v2: Add nft_output_json()
> Fix missing conversion to use NFT_CTX_OUTPUT_JSON.
> Remove json field from struct output_ctx.
>
> doc/libnftables.adoc | 16 +++-------------
> include/nftables.h | 6 +++++-
> include/nftables/libnftables.h | 3 +--
> src/libnftables.c | 24 ++++--------------------
> src/main.c | 2 +-
> src/monitor.c | 2 +-
> src/rule.c | 2 +-
> 7 files changed, 16 insertions(+), 39 deletions(-)
>
> diff --git a/doc/libnftables.adoc b/doc/libnftables.adoc
> index 8b7aee9af134..5a3562c3266c 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),
> };
> ----
>
> @@ -105,6 +103,8 @@ NFT_CTX_OUTPUT_STATELESS::
> If stateless output has been requested then stateful data is not
> printed. Stateful data refers to those objects that carry run-time data, eg.
> the *counter* statement holds packet and byte counter values, making it
> stateful.
> NFT_CTX_OUTPUT_HANDLE::
> Upon insertion into the ruleset, some elements are assigned a unique
> handle for identification purposes. 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. These functions allow to control whether ruleset listings should
> include handles or not.
> +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. These functions control JSON
> output format, input is auto-detected.
How about:
+ 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.
I.e. implement Phil's suggestion of a new line for each sentence.
I'd like to see the previous long line split similarly, but suggest to leave
that for a "reformat-only" patch with no change to content.
Cheers ... Duncan.
>
> The *nft_ctx_output_get_flags*() function returns the output flags setting's
> value in 'ctx'.
>
> @@ -186,16 +186,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 e0e7a1135406..86788a43dd71 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 a6ce938305c3..35374072560e 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 6dc1be3d5ef8..ff7a53d22ba4 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 97b8746608a7..8ea07641734d 100644
> --- a/src/main.c
> +++ b/src/main.c
> @@ -271,7 +271,7 @@ 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);
> + output_flags |= NFT_CTX_OUTPUT_JSON;
> break;
> case OPT_INVALID:
> exit(EXIT_FAILURE);
> diff --git a/src/monitor.c b/src/monitor.c
> index 9e3c43dcac68..01480cd7d86e 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 da1bdc44ab69..86b68cb8c34f 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)
> --
> 2.11.0
>