]> git.ipfire.org Git - thirdparty/libnftnl.git/commitdiff
lookup: xml: conditional output of dreg
authorArturo Borrero <arturo.borrero.glez@gmail.com>
Wed, 15 Jan 2014 10:42:22 +0000 (11:42 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Wed, 15 Jan 2014 13:09:55 +0000 (14:09 +0100)
The dreg attribute is optional as stated at:
linux/net/netfilter/nft_lookup.c

Signed-off-by: Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
src/expr/lookup.c

index 546066a6a8e53bc3816d87808c258864f84136bd..0e53f5817ef94a9f1a735b1ca683cbfb9c087aee 100644 (file)
@@ -213,41 +213,59 @@ nft_rule_expr_lookup_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree,
 
 static int
 nft_rule_expr_lookup_snprintf_json(char *buf, size_t size,
-                                 struct nft_expr_lookup *l)
+                                  struct nft_rule_expr *e)
 {
        int len = size, offset = 0, ret;
+       struct nft_expr_lookup *l = nft_expr_data(e);
 
-       ret = snprintf(buf, len, "\"set\":\"%s\",\"sreg\":%u,\"dreg\":%u",
-                       l->set_name, l->sreg, l->dreg);
+       ret = snprintf(buf, len, "\"set\":\"%s\",\"sreg\":%u",
+                       l->set_name, l->sreg);
        SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
 
+       if (e->flags & (1 << NFT_EXPR_LOOKUP_DREG)) {
+               ret = snprintf(buf+offset, len, ",\"dreg\":%u", l->dreg);
+               SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
+       }
+
        return offset;
 }
 
 
 static int
 nft_rule_expr_lookup_snprintf_xml(char *buf, size_t size,
-                                 struct nft_expr_lookup *l)
+                                 struct nft_rule_expr *e)
 {
        int len = size, offset = 0, ret;
+       struct nft_expr_lookup *l = nft_expr_data(e);
 
-       ret = snprintf(buf, len, "<set>%s</set><sreg>%u</sreg><dreg>%u</dreg>",
-                       l->set_name, l->sreg, l->dreg);
+       ret = snprintf(buf, len, "<set>%s</set><sreg>%u</sreg>",
+                      l->set_name, l->sreg);
        SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
 
+       if (e->flags & (1 << NFT_EXPR_LOOKUP_DREG)) {
+               ret = snprintf(buf+offset, len, "<dreg>%u</dreg>", l->dreg);
+               SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
+       }
+
        return offset;
 }
 
 static int
 nft_rule_expr_lookup_snprintf_default(char *buf, size_t size,
-                                     struct nft_expr_lookup *l)
+                                     struct nft_rule_expr *e)
 {
        int len = size, offset = 0, ret;
+       struct nft_expr_lookup *l = nft_expr_data(e);
 
-       ret = snprintf(buf, len, "reg %u set %s dreg %u ",
-                       l->sreg, l->set_name, l->dreg);
+       ret = snprintf(buf, len, "reg %u set %s ", l->sreg, l->set_name);
        SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
 
+
+       if (e->flags & (1 << NFT_EXPR_LOOKUP_DREG)) {
+               ret = snprintf(buf+offset, len, "dreg %u ", l->dreg);
+               SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
+       }
+
        return offset;
 }
 
@@ -255,15 +273,14 @@ static int
 nft_rule_expr_lookup_snprintf(char *buf, size_t size, uint32_t type,
                               uint32_t flags, struct nft_rule_expr *e)
 {
-       struct nft_expr_lookup *lookup = nft_expr_data(e);
 
        switch(type) {
        case NFT_OUTPUT_DEFAULT:
-               return nft_rule_expr_lookup_snprintf_default(buf, size, lookup);
+               return nft_rule_expr_lookup_snprintf_default(buf, size, e);
        case NFT_OUTPUT_XML:
-               return nft_rule_expr_lookup_snprintf_xml(buf, size, lookup);
+               return nft_rule_expr_lookup_snprintf_xml(buf, size, e);
        case NFT_OUTPUT_JSON:
-               return nft_rule_expr_lookup_snprintf_json(buf, size, lookup);
+               return nft_rule_expr_lookup_snprintf_json(buf, size, e);
        default:
                break;
        }