From 2535ba7006f22a6470f4c88ea7d30c343a1d8799 Mon Sep 17 00:00:00 2001 From: Phil Sutter Date: Thu, 28 Sep 2017 17:17:45 +0200 Subject: src: get rid of printf This patch introduces nft_print()/nft_gmp_print() functions which have to be used instead of printf to output information that were previously send to stdout. These functions print to a FILE pointer defined in struct output_ctx. It is set by calling: | old_fp = nft_ctx_set_output(ctx, new_fp); Having an application-defined FILE pointer is actually quite flexible: Using fmemopen() or even fopencookie(), an application gains full control over what is printed and where it should go to. Signed-off-by: Eric Leblond Signed-off-by: Phil Sutter Signed-off-by: Pablo Neira Ayuso --- include/datatype.h | 5 +++-- include/expression.h | 2 +- include/netlink.h | 8 ++++---- include/nftables.h | 6 ++++++ include/parser.h | 2 +- include/rule.h | 7 +++++-- 6 files changed, 20 insertions(+), 10 deletions(-) (limited to 'include') diff --git a/include/datatype.h b/include/datatype.h index 2e345910..e9f60798 100644 --- a/include/datatype.h +++ b/include/datatype.h @@ -209,7 +209,8 @@ extern void symbolic_constant_print(const struct symbol_table *tbl, struct output_ctx *octx); extern void symbol_table_print(const struct symbol_table *tbl, const struct datatype *dtype, - enum byteorder byteorder); + enum byteorder byteorder, + struct output_ctx *octx); extern struct symbol_table *rt_symbol_table_init(const char *filename); extern void rt_symbol_table_free(struct symbol_table *tbl); @@ -261,7 +262,7 @@ extern const struct datatype * set_datatype_alloc(const struct datatype *orig_dtype, unsigned int byteorder); extern void set_datatype_destroy(const struct datatype *dtype); -extern void time_print(uint64_t seconds); +extern void time_print(uint64_t seconds, struct output_ctx *octx); extern struct error_record *time_parse(const struct location *loc, const char *c, uint64_t *res); diff --git a/include/expression.h b/include/expression.h index 32d4423a..ce6b702a 100644 --- a/include/expression.h +++ b/include/expression.h @@ -334,7 +334,7 @@ extern struct expr *expr_get(struct expr *expr); extern void expr_free(struct expr *expr); extern void expr_print(const struct expr *expr, struct output_ctx *octx); extern bool expr_cmp(const struct expr *e1, const struct expr *e2); -extern void expr_describe(const struct expr *expr); +extern void expr_describe(const struct expr *expr, struct output_ctx *octx); extern const struct datatype *expr_basetype(const struct expr *expr); extern void expr_set_type(struct expr *expr, const struct datatype *dtype, diff --git a/include/netlink.h b/include/netlink.h index 79dc08f8..2ca6f345 100644 --- a/include/netlink.h +++ b/include/netlink.h @@ -180,14 +180,14 @@ extern int netlink_delete_obj(struct netlink_ctx *ctx, const struct handle *h, struct location *loc, uint32_t type); extern void netlink_dump_chain(const struct nftnl_chain *nlc, - unsigned int debug_mask); + struct netlink_ctx *ctx); extern void netlink_dump_rule(const struct nftnl_rule *nlr, - unsigned int debug_mask); + struct netlink_ctx *ctx); extern void netlink_dump_expr(const struct nftnl_expr *nle, FILE *fp, unsigned int debug_mask); extern void netlink_dump_set(const struct nftnl_set *nls, - unsigned int debug_mask); -extern void netlink_dump_obj(struct nftnl_obj *nlo, unsigned int debug_mask); + struct netlink_ctx *ctx); +extern void netlink_dump_obj(struct nftnl_obj *nlo, struct netlink_ctx *ctx); extern int netlink_batch_send(struct netlink_ctx *ctx, struct list_head *err_list); diff --git a/include/nftables.h b/include/nftables.h index 3429e4c1..01d72a87 100644 --- a/include/nftables.h +++ b/include/nftables.h @@ -30,6 +30,7 @@ struct output_ctx { unsigned int ip2name; unsigned int handle; unsigned int echo; + FILE *output_fp; }; struct nft_cache { @@ -148,4 +149,9 @@ void realm_table_meta_exit(void); void devgroup_table_exit(void); void realm_table_rt_exit(void); +int nft_print(struct output_ctx *octx, const char *fmt, ...) + __attribute__((format(printf, 2, 3))); +int nft_gmp_print(struct output_ctx *octx, const char *fmt, ...) + __attribute__((format(printf, 2, 0))); + #endif /* NFTABLES_NFTABLES_H */ diff --git a/include/parser.h b/include/parser.h index 431edfb3..0bdb3fa8 100644 --- a/include/parser.h +++ b/include/parser.h @@ -33,7 +33,7 @@ struct mnl_socket; extern void parser_init(struct mnl_socket *nf_sock, struct nft_cache *cache, struct parser_state *state, struct list_head *msgs, - unsigned int debug_level); + unsigned int debug_level, struct output_ctx *octx); extern int nft_parse(struct nft_ctx *ctx, void *, struct parser_state *state); extern void *scanner_init(struct parser_state *state); diff --git a/include/rule.h b/include/rule.h index 6f52b17f..c59bcea7 100644 --- a/include/rule.h +++ b/include/rule.h @@ -172,7 +172,8 @@ extern struct chain *chain_lookup(const struct table *table, extern const char *family2str(unsigned int family); extern const char *hooknum2str(unsigned int family, unsigned int hooknum); -extern void chain_print_plain(const struct chain *chain); +extern void chain_print_plain(const struct chain *chain, + struct output_ctx *octx); /** * struct rule - nftables rule @@ -493,6 +494,7 @@ struct eval_ctx { struct set *set; struct stmt *stmt; struct nft_cache *cache; + struct output_ctx *octx; unsigned int debug_mask; struct expr_ctx ectx; struct proto_ctx pctx; @@ -506,7 +508,8 @@ struct netlink_ctx; extern int do_command(struct netlink_ctx *ctx, struct cmd *cmd); extern int cache_update(struct mnl_socket *nf_sock, struct nft_cache *cache, - enum cmd_ops cmd, struct list_head *msgs, bool debug); + enum cmd_ops cmd, struct list_head *msgs, bool debug, + struct output_ctx *octx); extern void cache_flush(struct list_head *table_list); extern void cache_release(struct nft_cache *cache); -- cgit v1.2.3