From 4176e24e14f0723486253ebcfd2885c77f82f7b1 Mon Sep 17 00:00:00 2001 From: Phil Sutter Date: Tue, 10 Apr 2018 19:00:21 +0200 Subject: libnftables: Introduce nft_ctx_set_error() Analogous to nft_ctx_set_output(), this allows to set a custom file pointer for writing error messages to. Signed-off-by: Phil Sutter Signed-off-by: Pablo Neira Ayuso --- include/nftables.h | 1 + include/nftables/nftables.h | 2 ++ src/erec.c | 2 +- src/libnftables.c | 16 +++++++++++++--- 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/include/nftables.h b/include/nftables.h index 3d96f2e3..1b368971 100644 --- a/include/nftables.h +++ b/include/nftables.h @@ -14,6 +14,7 @@ struct output_ctx { unsigned int handle; unsigned int echo; FILE *output_fp; + FILE *error_fp; }; struct nft_cache { diff --git a/include/nftables/nftables.h b/include/nftables/nftables.h index 8e59f2b2..1e930682 100644 --- a/include/nftables/nftables.h +++ b/include/nftables/nftables.h @@ -57,6 +57,8 @@ 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); +FILE *nft_ctx_set_error(struct nft_ctx *ctx, FILE *fp); + int nft_ctx_add_include_path(struct nft_ctx *ctx, const char *path); void nft_ctx_clear_include_paths(struct nft_ctx *ctx); diff --git a/src/erec.c b/src/erec.c index 3e1b7fd1..226c51f5 100644 --- a/src/erec.c +++ b/src/erec.c @@ -124,7 +124,7 @@ void erec_print(struct output_ctx *octx, const struct error_record *erec, unsigned int i, end; int l; off_t orig_offset = 0; - FILE *f = octx->output_fp; + FILE *f = octx->error_fp; if (!f) return; diff --git a/src/libnftables.c b/src/libnftables.c index 8bf989b0..d6622d51 100644 --- a/src/libnftables.c +++ b/src/libnftables.c @@ -169,6 +169,7 @@ struct nft_ctx *nft_ctx_new(uint32_t flags) init_list_head(&ctx->cache.list); ctx->flags = flags; ctx->output.output_fp = stdout; + ctx->output.error_fp = stderr; if (flags == NFT_CTX_DEFAULT) nft_ctx_netlink_init(ctx); @@ -200,6 +201,18 @@ FILE *nft_ctx_set_output(struct nft_ctx *ctx, FILE *fp) return old; } +FILE *nft_ctx_set_error(struct nft_ctx *ctx, FILE *fp) +{ + FILE *old = ctx->output.error_fp; + + if (!fp || ferror(fp)) + return NULL; + + ctx->output.error_fp = fp; + + return old; +} + bool nft_ctx_get_dry_run(struct nft_ctx *ctx) { return ctx->check; @@ -282,7 +295,6 @@ int nft_run_cmd_from_buffer(struct nft_ctx *nft, char *buf, size_t buflen) LIST_HEAD(msgs); size_t nlbuflen; void *scanner; - FILE *fp; char *nlbuf; nlbuflen = max(buflen + 1, strlen(buf) + 2); @@ -297,9 +309,7 @@ int nft_run_cmd_from_buffer(struct nft_ctx *nft, char *buf, size_t buflen) if (nft_run(nft, nft->nf_sock, scanner, &state, &msgs) != 0) rc = -1; - fp = nft_ctx_set_output(nft, stderr); erec_print_list(&nft->output, &msgs, nft->debug_mask); - nft_ctx_set_output(nft, fp); scanner_destroy(scanner); iface_cache_release(); free(nlbuf); -- cgit v1.2.3