From 4a684c2ee4cdff2c5c6bfa06d93b58cb4e868bf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Neira=20Ayuso?= Date: Thu, 27 Jun 2013 21:56:18 +0200 Subject: src: support JSON format in chain, rule and expressions While at it, order possible switch cases of _snprintf. Signed-off-by: Alvaro Neira Ayuso Signed-off-by: Pablo Neira Ayuso --- src/expr/immediate.c | 40 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) (limited to 'src/expr/immediate.c') diff --git a/src/expr/immediate.c b/src/expr/immediate.c index 8bc810c..1937d82 100644 --- a/src/expr/immediate.c +++ b/src/expr/immediate.c @@ -299,6 +299,40 @@ nft_rule_expr_immediate_xml_parse(struct nft_rule_expr *e, char *xml) #endif } +static int +nft_rule_expr_immediate_snprintf_json(char *buf, size_t len, + struct nft_rule_expr *e, uint32_t flags) +{ + int size = len, offset = 0, ret; + struct nft_expr_immediate *imm = (struct nft_expr_immediate *)e->data; + + ret = snprintf(buf, len, "\"dreg\" : %u, " + "\"immediatedata\" : {", imm->dreg); + SNPRINTF_BUFFER_SIZE(ret, size, len, offset); + + + if (e->flags & (1 << NFT_EXPR_IMM_DATA)) { + ret = nft_data_reg_snprintf(buf+offset, len, &imm->data, + NFT_RULE_O_JSON, flags, DATA_VALUE); + SNPRINTF_BUFFER_SIZE(ret, size, len, offset); + + } else if (e->flags & (1 << NFT_EXPR_IMM_VERDICT)) { + ret = nft_data_reg_snprintf(buf+offset, len, &imm->data, + NFT_RULE_O_JSON, flags, DATA_VERDICT); + SNPRINTF_BUFFER_SIZE(ret, size, len, offset); + + } else if (e->flags & (1 << NFT_EXPR_IMM_CHAIN)) { + ret = nft_data_reg_snprintf(buf+offset, len, &imm->data, + NFT_RULE_O_JSON, flags, DATA_CHAIN); + SNPRINTF_BUFFER_SIZE(ret, size, len, offset); + } + + ret = snprintf(buf+offset, len, "}"); + SNPRINTF_BUFFER_SIZE(ret, size, len, offset); + + return offset; +} + static int nft_rule_expr_immediate_snprintf_xml(char *buf, size_t len, struct nft_rule_expr *e, uint32_t flags) @@ -367,10 +401,12 @@ nft_rule_expr_immediate_snprintf(char *buf, size_t len, uint32_t type, uint32_t flags, struct nft_rule_expr *e) { switch(type) { - case NFT_RULE_O_XML: - return nft_rule_expr_immediate_snprintf_xml(buf, len, e, flags); case NFT_RULE_O_DEFAULT: return nft_rule_expr_immediate_snprintf_default(buf, len, e, flags); + case NFT_RULE_O_XML: + return nft_rule_expr_immediate_snprintf_xml(buf, len, e, flags); + case NFT_RULE_O_JSON: + return nft_rule_expr_immediate_snprintf_json(buf, len, e, flags); default: break; } -- cgit v1.2.3