summaryrefslogtreecommitdiffstats
path: root/src/expr/cmp.c
diff options
context:
space:
mode:
authorAna Rey <anarey@gmail.com>2014-06-19 19:34:24 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2014-06-23 19:56:26 +0200
commitbc04bd902c7c2971154a5b97d494fc3a0c600a74 (patch)
treec3e4dd54bb16fdd7daca7b79b8790cb3063ea57e /src/expr/cmp.c
parente9f3b145b8148197c01837e892b521eeb09de91c (diff)
expr: cmp: Do not print unset values in json file
It changes the parse and snprintf functions to omit unset values. Signed-off-by: Ana Rey <anarey@gmail.com> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/expr/cmp.c')
-rw-r--r--src/expr/cmp.c41
1 files changed, 21 insertions, 20 deletions
diff --git a/src/expr/cmp.c b/src/expr/cmp.c
index 2ed05f5..8b0e54d 100644
--- a/src/expr/cmp.c
+++ b/src/expr/cmp.c
@@ -183,26 +183,22 @@ static int nft_rule_expr_cmp_json_parse(struct nft_rule_expr *e, json_t *root,
uint32_t uval32;
int base;
- if (nft_jansson_parse_val(root, "sreg", NFT_TYPE_U32, &uval32, err) < 0)
- return -1;
-
- nft_rule_expr_set_u32(e, NFT_EXPR_CMP_SREG, uval32);
+ if (nft_jansson_parse_val(root, "sreg", NFT_TYPE_U32, &uval32,
+ err) == 0)
+ nft_rule_expr_set_u32(e, NFT_EXPR_CMP_SREG, uval32);
op = nft_jansson_parse_str(root, "op", err);
- if (op == NULL)
- return -1;
-
- base = nft_str2cmp(op);
- if (base < 0)
- return -1;
+ if (op != NULL) {
+ base = nft_str2cmp(op);
+ if (base < 0)
+ return -1;
- nft_rule_expr_set_u32(e, NFT_EXPR_CMP_OP, base);
+ nft_rule_expr_set_u32(e, NFT_EXPR_CMP_OP, base);
+ }
if (nft_jansson_data_reg_parse(root, "cmpdata",
- &cmp->data, err) != DATA_VALUE)
- return -1;
-
- e->flags |= (1 << NFT_EXPR_CMP_DATA);
+ &cmp->data, err) == DATA_VALUE)
+ e->flags |= (1 << NFT_EXPR_CMP_DATA);
return 0;
#else
@@ -252,11 +248,16 @@ static int nft_rule_expr_cmp_snprintf_json(char *buf, size_t size,
struct nft_expr_cmp *cmp = nft_expr_data(e);
int len = size, offset = 0, ret;
- ret = snprintf(buf, len, "\"sreg\":%u,\"op\":\"%s\",",
- cmp->sreg, expr_cmp_str[cmp->op]);
- SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
-
- ret = nft_data_reg_snprintf(buf+offset, len, &cmp->data,
+ if (e->flags & (1 << NFT_EXPR_CMP_SREG)) {
+ ret = snprintf(buf + offset, len, "\"sreg\":%u,", cmp->sreg);
+ SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
+ }
+ if (e->flags & (1 << NFT_EXPR_CMP_OP)) {
+ ret = snprintf(buf + offset, len, "\"op\":\"%s\",",
+ expr_cmp_str[cmp->op]);
+ SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
+ }
+ ret = nft_data_reg_snprintf(buf + offset, len, &cmp->data,
NFT_OUTPUT_JSON, 0, DATA_VALUE);
SNPRINTF_BUFFER_SIZE(ret, size, len, offset);