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'*);
-
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'*);
NFT_CTX_OUTPUT_STATELESS = (1 << 2),
NFT_CTX_OUTPUT_HANDLE = (1 << 3),
NFT_CTX_OUTPUT_JSON = (1 << 4),
+ NFT_CTX_OUTPUT_ECHO = (1 << 5),
};
----
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.
+NFT_CTX_OUTPUT_ECHO::
+ The echo setting makes libnftables print the changes once they are committed to the kernel, just like a running instance of *nft monitor* would.
+Amongst other things, this allows to retrieve an added rule's handle atomically.
The *nft_ctx_output_get_flags*() function returns the output flags setting's value in 'ctx'.
The *nft_ctx_output_set_debug*() function sets the debug output setting in 'ctx' to the value of 'mask'.
-=== nft_ctx_output_get_echo() and nft_ctx_output_set_echo()
-The echo setting makes libnftables print the changes once they are committed to the kernel, just like a running instance of *nft monitor* would.
-Amongst other things, this allows to retrieve an added rule's handle atomically.
-The default setting is *false*.
-
-The *nft_ctx_output_get_echo*() function returns the echo output setting's value in 'ctx'.
-
-The *nft_ctx_output_set_echo*() function sets the echo 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.
struct output_ctx {
unsigned int flags;
unsigned int numeric;
- unsigned int echo;
union {
FILE *output_fp;
struct cookie output_cookie;
return octx->flags & NFT_CTX_OUTPUT_JSON;
}
+static inline bool nft_output_echo(const struct output_ctx *octx)
+{
+ return octx->flags & NFT_CTX_OUTPUT_ECHO;
+}
+
struct nft_cache {
uint16_t genid;
struct list_head list;
NFT_CTX_OUTPUT_STATELESS = (1 << 2),
NFT_CTX_OUTPUT_HANDLE = (1 << 3),
NFT_CTX_OUTPUT_JSON = (1 << 4),
+ NFT_CTX_OUTPUT_ECHO = (1 << 5),
};
unsigned int nft_ctx_output_get_flags(struct nft_ctx *ctx);
void nft_ctx_output_set_numeric(struct nft_ctx *ctx, enum nft_numeric_level level);
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);
FILE *nft_ctx_set_output(struct nft_ctx *ctx, FILE *fp);
int nft_ctx_buffer_output(struct nft_ctx *ctx);
ctx->debug_mask = mask;
}
-bool nft_ctx_output_get_echo(struct nft_ctx *ctx)
-{
- return ctx->output.echo;
-}
-
-void nft_ctx_output_set_echo(struct nft_ctx *ctx, bool val)
-{
- ctx->output.echo = val;
-}
-
static const struct input_descriptor indesc_cmdline = {
.type = INDESC_BUFFER,
.name = "<cmdline>",
}
free(nlbuf);
- if (!rc && nft_output_json(&nft->output) && nft->output.echo)
+ if (!rc &&
+ nft_output_json(&nft->output) &&
+ nft_output_echo(&nft->output))
json_print_echo(nft);
return rc;
}
nft->scanner = NULL;
}
- if (!rc && nft_output_json(&nft->output) && nft->output.echo)
+ if (!rc &&
+ nft_output_json(&nft->output) &&
+ nft_output_echo(&nft->output))
json_print_echo(nft);
return rc;
}
output_flags |= NFT_CTX_OUTPUT_HANDLE;
break;
case OPT_ECHO:
- nft_ctx_output_set_echo(nft, true);
+ output_flags |= NFT_CTX_OUTPUT_ECHO;
break;
case OPT_JSON:
#ifdef HAVE_LIBJANSSON
struct nlmsghdr *nlh;
int err;
- if (ctx->nft->output.echo) {
+ if (nft_output_echo(&ctx->nft->output)) {
err = cache_update(ctx->nft, CMD_INVALID, ctx->msgs);
if (err < 0)
return err;
.cache_needed = true,
};
- if (!echo_monh.ctx->nft->output.echo)
+ if (!nft_output_echo(&echo_monh.ctx->nft->output))
return MNL_CB_OK;
if (nft_output_json(&ctx->nft->output))
ret = __json_parse(&ctx);
- if (!nft->output.echo) {
+ if (!nft_output_echo(&nft->output)) {
json_decref(nft->json_root);
nft->json_root = NULL;
}
ret = __json_parse(&ctx);
- if (!nft->output.echo) {
+ if (!nft_output_echo(&nft->output)) {
json_decref(nft->json_root);
nft->json_root = NULL;
}
{
uint32_t flags = excl ? NLM_F_EXCL : 0;
- if (ctx->nft->output.echo) {
+ if (nft_output_echo(&ctx->nft->output)) {
int ret;
ret = cache_update(ctx->nft, cmd->obj, ctx->msgs);
{
uint32_t flags = 0;
- if (ctx->nft->output.echo) {
+ if (nft_output_echo(&ctx->nft->output)) {
int ret;
ret = cache_update(ctx->nft, cmd->obj, ctx->msgs);