summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorÁlvaro Neira Ayuso <alvaroneay@gmail.com>2013-08-09 13:14:16 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2013-08-09 13:30:00 +0200
commit4d9c3be03d14ffd8e4f71083f1f3051b45054b19 (patch)
tree7db2d57086c94d18090f389ee16299b3492aa63a
parentcad41d6e8f70ebee69f1de4ddf12355186e72567 (diff)
expr: payload: add nft_str2base function
Add function that will be use in the JSON parser Signed-off-by: Alvaro Neira Ayuso Ayuso <alvaroneay@gmail.com> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r--src/expr/payload.c31
1 files changed, 19 insertions, 12 deletions
diff --git a/src/expr/payload.c b/src/expr/payload.c
index 34aee90..6d23e20 100644
--- a/src/expr/payload.c
+++ b/src/expr/payload.c
@@ -13,6 +13,7 @@
#include <stdio.h>
#include <stdint.h>
+#include <string.h>
#include <limits.h>
#include <arpa/inet.h>
#include <errno.h>
@@ -178,13 +179,27 @@ nft_rule_expr_payload_snprintf_json(char *buf, size_t len, uint32_t flags,
return offset;
}
+static inline int nft_str2base(const char *base)
+{
+ if (strcmp(base, "link") == 0)
+ return NFT_PAYLOAD_LL_HEADER;
+ else if (strcmp(base, "network") == 0)
+ return NFT_PAYLOAD_NETWORK_HEADER;
+ else if (strcmp(base, "transport") == 0)
+ return NFT_PAYLOAD_TRANSPORT_HEADER;
+ else {
+ errno = EINVAL;
+ return -1;
+ }
+}
+
static int
nft_rule_expr_payload_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree)
{
#ifdef XML_PARSING
struct nft_expr_payload *payload = nft_expr_data(e);
const char *base_str;
- int32_t reg;
+ int32_t reg, base;
reg = nft_mxml_reg_parse(tree, "dreg", MXML_DESCEND_FIRST);
if (reg < 0)
@@ -197,14 +212,9 @@ nft_rule_expr_payload_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree)
if (base_str == NULL)
return -1;
- if (strcmp(base_str, "link") == 0)
- payload->base = NFT_PAYLOAD_LL_HEADER;
- else if (strcmp(base_str, "network") == 0)
- payload->base = NFT_PAYLOAD_NETWORK_HEADER;
- else if (strcmp(base_str, "transport") == 0)
- payload->base = NFT_PAYLOAD_TRANSPORT_HEADER;
- else
- goto err;
+ base = nft_str2base(base_str);
+ if (base < 0)
+ return -1;
e->flags |= (1 << NFT_EXPR_PAYLOAD_BASE);
@@ -220,9 +230,6 @@ nft_rule_expr_payload_xml_parse(struct nft_rule_expr *e, mxml_node_t *tree)
e->flags |= (1 << NFT_EXPR_PAYLOAD_LEN);
return 0;
-err:
- errno = EINVAL;
- return -1;
#else
errno = EOPNOTSUPP;
return -1;