]> git.ipfire.org Git - thirdparty/libnftnl.git/commitdiff
expr: cmp: Do not print unset values in xml file
authorAna Rey <anarey@gmail.com>
Thu, 19 Jun 2014 17:34:23 +0000 (19:34 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Mon, 23 Jun 2014 17:55:15 +0000 (19:55 +0200)
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>
src/expr/cmp.c

index cc0157301a2554ca647b7824fe51ccb6c1163679..2ed05f5682afcb408145586463e3e959486260c3 100644 (file)
@@ -221,26 +221,23 @@ static int nft_rule_expr_cmp_xml_parse(struct nft_rule_expr *e, mxml_node_t *tre
        uint32_t sreg;
 
        if (nft_mxml_reg_parse(tree, "sreg", &sreg, MXML_DESCEND_FIRST,
-                              NFT_XML_MAND, err) != 0)
-               return -1;
-       nft_rule_expr_set_u32(e, NFT_EXPR_CMP_SREG, sreg);
+                              NFT_XML_MAND, err) == 0)
+               nft_rule_expr_set_u32(e, NFT_EXPR_CMP_SREG, sreg);
 
        op = nft_mxml_str_parse(tree, "op", MXML_DESCEND_FIRST, NFT_XML_MAND,
                                err);
-       if (op == NULL)
-               return -1;
+       if (op != NULL) {
+               op_value = nft_str2cmp(op);
+               if (op_value < 0)
+                       return -1;
 
-       op_value = nft_str2cmp(op);
-       if (op_value < 0)
-               return -1;
-       nft_rule_expr_set_u32(e, NFT_EXPR_CMP_OP, op_value);
+               nft_rule_expr_set_u32(e, NFT_EXPR_CMP_OP, op_value);
+       }
 
        if (nft_mxml_data_reg_parse(tree, "cmpdata",
                                    &cmp->data, NFT_XML_MAND,
-                                   err) != DATA_VALUE)
-               return -1;
-
-       e->flags |= (1 << NFT_EXPR_CMP_DATA);
+                                   err) == DATA_VALUE)
+               e->flags |= (1 << NFT_EXPR_CMP_DATA);
 
        return 0;
 #else
@@ -272,11 +269,19 @@ static int nft_rule_expr_cmp_snprintf_xml(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</sreg><op>%s</op>",
-                      cmp->sreg, expr_cmp_str[cmp->op]);
-       SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
+       if (e->flags & (1 << NFT_EXPR_CMP_SREG)) {
+               ret = snprintf(buf, len, "<sreg>%u</sreg>",
+                              cmp->sreg);
+               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, "<op>%s</op>",
+                              expr_cmp_str[cmp->op]);
+               SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
+       }
+
+       ret = nft_data_reg_snprintf(buf + offset, len, &cmp->data,
                                    NFT_OUTPUT_XML, 0, DATA_VALUE);
        SNPRINTF_BUFFER_SIZE(ret, size, len, offset);