summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAna Rey <anarey@gmail.com>2014-06-22 20:32:21 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2014-06-23 19:45:48 +0200
commit9f75fbe0faf815be7ae1253e34e1c29917fb8350 (patch)
tree5b8814646a816863e21c050589f8663a572e81ee /src
parent8b42ed32cee01c6aab256a5609a150b46ec0af0e (diff)
expr: payload: 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>
Diffstat (limited to 'src')
-rw-r--r--src/expr/payload.c57
1 files changed, 30 insertions, 27 deletions
diff --git a/src/expr/payload.c b/src/expr/payload.c
index 78878f3..95c9d9c 100644
--- a/src/expr/payload.c
+++ b/src/expr/payload.c
@@ -170,14 +170,24 @@ nft_rule_expr_payload_snprintf_json(char *buf, size_t len, uint32_t flags,
struct nft_expr_payload *payload = nft_expr_data(e);
int size = len, offset = 0, ret;
- ret = snprintf(buf, len, "\"dreg\":%u,"
- "\"offset\":%u,"
- "\"len\":%u,"
- "\"base\":\"%s\"",
- payload->dreg, payload->offset, payload->len,
- base2str(payload->base));
- SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
-
+ if (e->flags & (1 << NFT_EXPR_PAYLOAD_DREG)) {
+ ret = snprintf(buf, len, "\"dreg\":%u,", payload->dreg);
+ SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
+ }
+ if (e->flags & (1 << NFT_EXPR_PAYLOAD_OFFSET)) {
+ ret = snprintf(buf + offset, len, "\"offset\":%u,",
+ payload->offset);
+ SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
+ }
+ if (e->flags & (1 << NFT_EXPR_PAYLOAD_LEN)) {
+ ret = snprintf(buf + offset, len, "\"len\":%u,", payload->len);
+ SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
+ }
+ if (e->flags & (1 << NFT_EXPR_PAYLOAD_BASE)) {
+ ret = snprintf(buf + offset, len, "\"base\":\"%s\"",
+ base2str(payload->base));
+ SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
+ }
return offset;
}
@@ -204,31 +214,24 @@ nft_rule_expr_payload_json_parse(struct nft_rule_expr *e, json_t *root,
uint32_t reg, uval32;
int base;
- if (nft_jansson_parse_reg(root, "dreg", NFT_TYPE_U32, &reg, err) < 0)
- return -1;
-
- nft_rule_expr_set_u32(e, NFT_EXPR_PAYLOAD_DREG, reg);
+ if (nft_jansson_parse_reg(root, "dreg", NFT_TYPE_U32, &reg, err) == 0)
+ nft_rule_expr_set_u32(e, NFT_EXPR_PAYLOAD_DREG, reg);
base_str = nft_jansson_parse_str(root, "base", err);
- if (base_str == NULL)
- return -1;
-
- base = nft_str2base(base_str);
- if (base < 0)
- return -1;
+ if (base_str != NULL) {
+ base = nft_str2base(base_str);
+ if (base < 0)
+ return -1;
- nft_rule_expr_set_u32(e, NFT_EXPR_PAYLOAD_BASE, base);
+ nft_rule_expr_set_u32(e, NFT_EXPR_PAYLOAD_BASE, base);
+ }
if (nft_jansson_parse_val(root, "offset", NFT_TYPE_U32, &uval32,
- err) < 0)
- return -1;
-
- nft_rule_expr_set_u32(e, NFT_EXPR_PAYLOAD_OFFSET, uval32);
-
- if (nft_jansson_parse_val(root, "len", NFT_TYPE_U32, &uval32, err) < 0)
- return -1;
+ err) == 0)
+ nft_rule_expr_set_u32(e, NFT_EXPR_PAYLOAD_OFFSET, uval32);
- nft_rule_expr_set_u32(e, NFT_EXPR_PAYLOAD_LEN, uval32);
+ if (nft_jansson_parse_val(root, "len", NFT_TYPE_U32, &uval32, err) == 0)
+ nft_rule_expr_set_u32(e, NFT_EXPR_PAYLOAD_LEN, uval32);
return 0;
#else