summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAna Rey <anarey@gmail.com>2014-06-21 17:53:42 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2014-06-23 19:29:31 +0200
commit112112ed2c0e0fa0ce30aba5ca542ffd1d1d31e0 (patch)
tree82dd14c2d34dad50b1899ef9ab69a11e911d80bb
parent141e256e4c4e259acdfedaef79f0234d25c319ae (diff)
expr: immediate: Do not print unset values in json file
It changes the parse functions to omit unset values. Signed-off-by: Ana Rey <anarey@gmail.com> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r--src/expr/immediate.c50
1 files changed, 23 insertions, 27 deletions
diff --git a/src/expr/immediate.c b/src/expr/immediate.c
index eab1497..9364399 100644
--- a/src/expr/immediate.c
+++ b/src/expr/immediate.c
@@ -186,30 +186,26 @@ nft_rule_expr_immediate_json_parse(struct nft_rule_expr *e, json_t *root,
int datareg_type;
uint32_t reg;
- if (nft_jansson_parse_reg(root, "dreg", NFT_TYPE_U32, &reg, err) < 0)
- return -1;
-
- nft_rule_expr_set_u32(e, NFT_EXPR_IMM_DREG, reg);
+ if (nft_jansson_parse_reg(root, "dreg", NFT_TYPE_U32, &reg, err) == 0)
+ nft_rule_expr_set_u32(e, NFT_EXPR_IMM_DREG, reg);
datareg_type = nft_jansson_data_reg_parse(root, "immediatedata",
&imm->data, err);
- if (datareg_type < 0)
- return -1;
-
- switch (datareg_type) {
- case DATA_VALUE:
- e->flags |= (1 << NFT_EXPR_IMM_DATA);
- break;
- case DATA_VERDICT:
- e->flags |= (1 << NFT_EXPR_IMM_VERDICT);
- break;
- case DATA_CHAIN:
- e->flags |= (1 << NFT_EXPR_IMM_CHAIN);
- break;
- default:
- return -1;
+ if (datareg_type >= 0) {
+ switch (datareg_type) {
+ case DATA_VALUE:
+ e->flags |= (1 << NFT_EXPR_IMM_DATA);
+ break;
+ case DATA_VERDICT:
+ e->flags |= (1 << NFT_EXPR_IMM_VERDICT);
+ break;
+ case DATA_CHAIN:
+ e->flags |= (1 << NFT_EXPR_IMM_CHAIN);
+ break;
+ default:
+ return -1;
+ }
}
-
return 0;
#else
errno = EOPNOTSUPP;
@@ -261,22 +257,22 @@ nft_rule_expr_immediate_snprintf_json(char *buf, size_t len,
int size = len, offset = 0, ret;
struct nft_expr_immediate *imm = nft_expr_data(e);
- ret = snprintf(buf, len, "\"dreg\":%u,", imm->dreg);
- SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
-
-
+ if (e->flags & (1 << NFT_EXPR_IMM_DREG)) {
+ ret = snprintf(buf, len, "\"dreg\":%u,", 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,
+ ret = nft_data_reg_snprintf(buf + offset, len, &imm->data,
NFT_OUTPUT_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,
+ ret = nft_data_reg_snprintf(buf + offset, len, &imm->data,
NFT_OUTPUT_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,
+ ret = nft_data_reg_snprintf(buf + offset, len, &imm->data,
NFT_OUTPUT_JSON, flags, DATA_CHAIN);
SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
}