From c83c53a26de25c1e2900f7841647cec3b57c7438 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Neira=20Ayuso?= Date: Tue, 20 Aug 2013 17:58:46 +0200 Subject: rule: Add json parser support Add function for parsing rules in JSON format Signed-off-by: Alvaro Neira Ayuso Signed-off-by: Pablo Neira Ayuso --- src/expr/data_reg.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) (limited to 'src/expr/data_reg.c') diff --git a/src/expr/data_reg.c b/src/expr/data_reg.c index 4c354ef..d0e1a83 100644 --- a/src/expr/data_reg.c +++ b/src/expr/data_reg.c @@ -26,6 +26,83 @@ #include "data_reg.h" #include "internal.h" +#ifdef JSON_PARSING +static int nft_data_reg_verdict_json_parse(union nft_data_reg *reg, json_t *data) +{ + int verdict; + const char *verdict_str; + + verdict_str = nft_jansson_value_parse_str(data, "verdict"); + if (verdict_str == NULL) + return -1; + + verdict = nft_str2verdict(verdict_str); + if (verdict < 0) + return -1; + + reg->verdict = (uint32_t)verdict; + + return 0; +} + +static int nft_data_reg_chain_json_parse(union nft_data_reg *reg, json_t *data) +{ + reg->chain = strdup(nft_jansson_value_parse_str(data, "chain")); + if (reg->chain == NULL) { + return -1; + } + + return 0; +} + +static int nft_data_reg_value_json_parse(union nft_data_reg *reg, json_t *data) +{ + int i; + char node_name[6]; + + if (nft_jansson_value_parse_val(data, "len", NFT_TYPE_U8, + ®->len) != 0) + return -1; + + for (i = 0; i < div_round_up(reg->len, sizeof(uint32_t)); i++) { + sprintf(node_name, "data%d", i); + + if (nft_jansson_str2num(data, node_name, BASE_HEX, + ®->val[i], NFT_TYPE_U32) != 0) + return -1; + } + + return 0; +} +#endif + +int nft_data_reg_json_parse(union nft_data_reg *reg, json_t *data) +{ +#ifdef JSON_PARSING + + const char *type; + + type = nft_jansson_value_parse_str(data, "type"); + if (type == NULL) { + return -1; + } + + /* Select what type of parsing is needed */ + if (strcmp(type, "value") == 0) { + return nft_data_reg_value_json_parse(reg, data); + } else if (strcmp(type, "verdict") == 0) { + return nft_data_reg_verdict_json_parse(reg, data); + } else if (strcmp(type, "chain") == 0) { + return nft_data_reg_chain_json_parse(reg, data); + } + + return 0; +#else + errno = EOPNOTSUPP; + return -1; +#endif +} + #ifdef XML_PARSING static int nft_data_reg_verdict_xml_parse(union nft_data_reg *reg, char *xml) { -- cgit v1.2.3