diff options
Diffstat (limited to 'src/expr/target.c')
-rw-r--r-- | src/expr/target.c | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/src/expr/target.c b/src/expr/target.c index 1ee7379..86c9bc8 100644 --- a/src/expr/target.c +++ b/src/expr/target.c @@ -23,6 +23,7 @@ #include <linux/netfilter/x_tables.h> #include <libnftables/expr.h> +#include <libnftables/rule.h> #include "expr_ops.h" @@ -183,14 +184,46 @@ static int nft_rule_expr_target_parse(struct nft_rule_expr *e, struct nlattr *at return 0; } +static +int nft_rule_exp_target_snprintf_xml(char *buf, size_t len, + struct nft_expr_target *tg) +{ + int ret, size=len; + int i; + int offset = 0; + uint8_t *data = (uint8_t *)tg->data; + + ret = snprintf(buf, len, "\t\t<name>%s</name> <rev>%u</rev> <info>0x", + tg->name, tg->rev); + SNPRINTF_BUFFER_SIZE(ret, size, len, offset); + + for (i=0; i < tg->data_len; i++) { + ret = snprintf(buf+offset, len, "%x", data[i] & 0xff); + SNPRINTF_BUFFER_SIZE(ret, size, len, offset); + } + + ret = snprintf(buf+offset, len, "</info>" ); + SNPRINTF_BUFFER_SIZE(ret, size, len, offset); + + return offset; +} + static int nft_rule_expr_target_snprintf(char *buf, size_t len, uint32_t type, uint32_t flags, struct nft_rule_expr *e) { struct nft_expr_target *target = (struct nft_expr_target *)e->data; - return snprintf(buf, len, "name=%s rev=%u ", - target->name, target->rev); + switch(type) { + case NFT_RULE_O_XML: + return nft_rule_exp_target_snprintf_xml(buf, len, target); + case NFT_RULE_O_DEFAULT: + return snprintf(buf, len, "name=%s rev=%u ", + target->name, target->rev); + default: + break; + } + return -1; } struct expr_ops expr_ops_target = { |