summaryrefslogtreecommitdiffstats
path: root/src/expr/target.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/expr/target.c')
-rw-r--r--src/expr/target.c37
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 = {