summaryrefslogtreecommitdiffstats
path: root/src/expr/immediate.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/expr/immediate.c')
-rw-r--r--src/expr/immediate.c71
1 files changed, 15 insertions, 56 deletions
diff --git a/src/expr/immediate.c b/src/expr/immediate.c
index 5f54129..be70445 100644
--- a/src/expr/immediate.c
+++ b/src/expr/immediate.c
@@ -21,6 +21,7 @@
#include <libnftnl/rule.h>
#include "expr_ops.h"
#include "data_reg.h"
+#include <buffer.h>
struct nft_expr_immediate {
union nft_data_reg data;
@@ -248,63 +249,22 @@ nft_rule_expr_immediate_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree,
}
static int
-nft_rule_expr_immediate_snprintf_json(char *buf, size_t len,
- struct nft_rule_expr *e, uint32_t flags)
+nft_rule_expr_immediate_export(char *buf, size_t size, struct nft_rule_expr *e,
+ int type)
{
- int size = len, offset = 0, ret;
struct nft_expr_immediate *imm = nft_expr_data(e);
+ NFT_BUF_INIT(b, buf, size);
- if (e->flags & (1 << NFT_EXPR_IMM_DREG)) {
- ret = snprintf(buf, len, "\"dreg\":%u,", imm->dreg);
- SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
- }
- if (e->flags & (1 << NFT_EXPR_IMM_DATA)) {
- ret = nft_data_reg_snprintf(buf + offset, len, &imm->data,
- NFT_OUTPUT_JSON, flags, DATA_VALUE);
- SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
-
- } else if (e->flags & (1 << NFT_EXPR_IMM_VERDICT)) {
- ret = nft_data_reg_snprintf(buf + offset, len, &imm->data,
- NFT_OUTPUT_JSON, flags, DATA_VERDICT);
- SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
-
- } else if (e->flags & (1 << NFT_EXPR_IMM_CHAIN)) {
- ret = nft_data_reg_snprintf(buf + offset, len, &imm->data,
- NFT_OUTPUT_JSON, flags, DATA_CHAIN);
- SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
- }
-
- return offset;
-}
-
-static int
-nft_rule_expr_immediate_snprintf_xml(char *buf, size_t len,
- struct nft_rule_expr *e, uint32_t flags)
-{
- int size = len, offset = 0, ret;
- struct nft_expr_immediate *imm = nft_expr_data(e);
-
- if (e->flags & (1 << NFT_EXPR_IMM_DREG)) {
- ret = snprintf(buf, len, "<dreg>%u</dreg>", imm->dreg);
- SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
- }
- if (e->flags & (1 << NFT_EXPR_IMM_DATA)) {
- ret = nft_data_reg_snprintf(buf + offset, len, &imm->data,
- NFT_OUTPUT_XML, flags, DATA_VALUE);
- SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
-
- } else if (e->flags & (1 << NFT_EXPR_IMM_VERDICT)) {
- ret = nft_data_reg_snprintf(buf + offset, len, &imm->data,
- NFT_OUTPUT_XML, flags, DATA_VERDICT);
- SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
-
- } else if (e->flags & (1 << NFT_EXPR_IMM_CHAIN)) {
- ret = nft_data_reg_snprintf(buf + offset, len, &imm->data,
- NFT_OUTPUT_XML, flags, DATA_CHAIN);
- SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
- }
-
- return offset;
+ if (e->flags & (1 << NFT_EXPR_IMM_DREG))
+ nft_buf_u32(&b, type, imm->dreg, DREG);
+ if (e->flags & (1 << NFT_EXPR_IMM_DATA))
+ nft_buf_reg(&b, type, &imm->data, DATA_VALUE, DATA);
+ if (e->flags & (1 << NFT_EXPR_IMM_VERDICT))
+ nft_buf_reg(&b, type, &imm->data, DATA_VERDICT, DATA);
+ if (e->flags & (1 << NFT_EXPR_IMM_CHAIN))
+ nft_buf_reg(&b, type, &imm->data, DATA_CHAIN, DATA);
+
+ return nft_buf_done(&b);
}
static int
@@ -344,9 +304,8 @@ nft_rule_expr_immediate_snprintf(char *buf, size_t len, uint32_t type,
case NFT_OUTPUT_DEFAULT:
return nft_rule_expr_immediate_snprintf_default(buf, len, e, flags);
case NFT_OUTPUT_XML:
- return nft_rule_expr_immediate_snprintf_xml(buf, len, e, flags);
case NFT_OUTPUT_JSON:
- return nft_rule_expr_immediate_snprintf_json(buf, len, e, flags);
+ return nft_rule_expr_immediate_export(buf, len, e, type);
default:
break;
}