Series to add JSON output support for rules
cover Series to add JSON output support for rules
Json support for exporting rules and add implementation for testing this functions. I have also ordered the switch case in the right order:
First position: Default Support
Second position: Xml Support
Last position: Json Support
---
Álvaro Neira Ayuso (2):
Add function for exporting rule to JSON format and Order the switch values in the right order Add code for testing the new functions for exporting rules to JSON Format
examples/nft-rule-get.c | 5 +++ include/libnftables/rule.h | 1 + src/chain.c | 8 +++-- src/expr/bitwise.c | 37 ++++++++++++++++++++++++- src/expr/byteorder.c | 22 +++++++++++++++ src/expr/cmp.c | 25 ++++++++++++++++- src/expr/counter.c | 7 +++-- src/expr/ct.c | 5 +++ src/expr/data_reg.c | 65 +++++++++++++++++++++++++++++++++++++++----- src/expr/exthdr.c | 16 +++++++---- src/expr/immediate.c | 40 ++++++++++++++++++++++++++- src/expr/limit.c | 4 +++ src/expr/log.c | 7 +++++ src/expr/lookup.c | 20 ++++++++++++-- src/expr/match.c | 18 +++++++++++- src/expr/meta.c | 10 +++++-- src/expr/nat.c | 44 ++++++++++++++++++++++++++++-- src/expr/payload.c | 39 ++++++++++++++++++++++++-- src/expr/target.c | 19 ++++++++++++- src/internal.h | 1 + src/rule.c | 52 ++++++++++++++++++++++++++++++++++- src/table.c | 4 +-- 22 files changed, 406 insertions(+), 43 deletions(-)
Signature · 5 lines
Álvaro Neira Ayuso -- To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH 1/2 Add function for exporting rule to JSON format and Order the switch values in the right order
From: Álvaro Neira Ayuso <[email protected]>
--- include/libnftables/rule.h | 1 + src/chain.c | 8 +++-- src/expr/bitwise.c | 37 ++++++++++++++++++++++++- src/expr/byteorder.c | 22 +++++++++++++++ src/expr/cmp.c | 25 ++++++++++++++++- src/expr/counter.c | 7 +++-- src/expr/ct.c | 5 +++ src/expr/data_reg.c | 65 +++++++++++++++++++++++++++++++++++++++----- src/expr/exthdr.c | 16 +++++++---- src/expr/immediate.c | 40 ++++++++++++++++++++++++++- src/expr/limit.c | 4 +++ src/expr/log.c | 7 +++++ src/expr/lookup.c | 20 ++++++++++++-- src/expr/match.c | 18 +++++++++++- src/expr/meta.c | 10 +++++-- src/expr/nat.c | 44 ++++++++++++++++++++++++++++-- src/expr/payload.c | 39 ++++++++++++++++++++++++-- src/expr/target.c | 19 ++++++++++++- src/internal.h | 1 + src/rule.c | 52 ++++++++++++++++++++++++++++++++++- src/table.c | 4 +-- 21 files changed, 402 insertions(+), 42 deletions(-)
include/libnftables/rule.h +1 -0
@@ -44,6 +44,7 @@ void nft_rule_nlmsg_build_payload(struct nlmsghdr *nlh, struct nft_rule *t);enum {NFT_RULE_O_DEFAULT =0 ,NFT_RULE_O_XML , +NFT_RULE_O_JSON , };enum nft_rule_parse_type {
src/chain.c +4 -4
@@ -794,12 +794,12 @@ int nft_chain_snprintf(char *buf, size_t size, struct nft_chain *c, uint32_t type, uint32_t flags) {switch (type) { -case NFT_CHAIN_O_JSON : -return nft_chain_snprintf_json (buf, size, c); -case NFT_CHAIN_O_XML : -return nft_chain_snprintf_xml (buf, size, c);case NFT_CHAIN_O_DEFAULT :return nft_chain_snprintf_default (buf, size, c); +case NFT_CHAIN_O_XML : +return nft_chain_snprintf_xml (buf, size, c); +case NFT_CHAIN_O_JSON : +return nft_chain_snprintf_json (buf, size, c);default :break ; }
src/expr/bitwise.c +35 -2
@@ -325,6 +325,37 @@ nft_rule_expr_bitwise_xml_parse(struct nft_rule_expr *e, char *xml) }static int +nft_rule_expr_bitwise_snprintf_json (char *buf,size_t size, +struct nft_expr_bitwise *bitwise) +{ +int len = size, offset =0 , ret; + + ret =snprintf (buf, len,"\"sreg\" : %u, " +"\"dreg\" : %u, " , + bitwise->sreg, bitwise->dreg); +SNPRINTF_BUFFER_SIZE (ret, size, len, offset); + + ret =snprintf (buf+offset, len,"\"mask\" : " ); +SNPRINTF_BUFFER_SIZE (ret, size, len, offset); + + ret =nft_data_reg_snprintf (buf+offset, len, &bitwise->mask, +NFT_RULE_O_JSON ,0 ,DATA_VALUE ); +SNPRINTF_BUFFER_SIZE (ret, size, len, offset); + + ret =snprintf (buf+offset, len,", \"xor\" : " ); +SNPRINTF_BUFFER_SIZE (ret, size, len, offset); + + ret =nft_data_reg_snprintf (buf+offset, len, &bitwise->xor, +NFT_RULE_O_JSON ,0 ,DATA_VALUE ); +SNPRINTF_BUFFER_SIZE (ret, size, len, offset); + + ret =snprintf (buf+offset, len,"\"" ); +SNPRINTF_BUFFER_SIZE (ret, size, len, offset); + +return offset; +} + +static int nft_rule_expr_bitwise_snprintf_xml (char *buf,size_t size,struct nft_expr_bitwise *bitwise) {
@@ -389,11 +420,13 @@ nft_rule_expr_bitwise_snprintf(char *buf, size_t size, uint32_t type,struct nft_expr_bitwise *bitwise = (struct nft_expr_bitwise *)e->data;switch (type) { -case NFT_RULE_O_XML : -return nft_rule_expr_bitwise_snprintf_xml (buf, size, bitwise);case NFT_RULE_O_DEFAULT :return nft_rule_expr_bitwise_snprintf_default (buf, size, bitwise); +case NFT_RULE_O_XML : +return nft_rule_expr_bitwise_snprintf_xml (buf, size, bitwise); +case NFT_RULE_O_JSON : +return nft_rule_expr_bitwise_snprintf_json (buf, size, bitwise);default :break ; }
src/expr/byteorder.c +22 -0
@@ -298,6 +298,25 @@ err: }static int +nft_rule_expr_byteorder_snprintf_json (char *buf,size_t size, +struct nft_expr_byteorder *byteorder) +{ +int len = size, offset =0 , ret; + + ret =snprintf (buf, len,"\"sreg\" : %u, " +"\"dreg\" : %u, " +"\"op\" : \"%s\", " +"\"len\" : %u, " +"\"size\" : %u" , + byteorder->sreg, byteorder->dreg, + expr_byteorder_str[byteorder->op], + byteorder->len, byteorder->size); +SNPRINTF_BUFFER_SIZE (ret, size, len, offset); + +return offset; +} + +static int nft_rule_expr_byteorder_snprintf_xml (char *buf,size_t size,struct nft_expr_byteorder *byteorder) {
@@ -344,6 +363,9 @@ nft_rule_expr_byteorder_snprintf(char *buf, size_t size, uint32_t type,case NFT_RULE_O_XML :return nft_rule_expr_byteorder_snprintf_xml (buf, size, byteorder); +case NFT_RULE_O_JSON : +return nft_rule_expr_byteorder_snprintf_json (buf, size, + byteorder);default :break ; }
src/expr/cmp.c +23 -2
@@ -265,6 +265,25 @@ static int nft_rule_expr_cmp_xml_parse(struct nft_rule_expr *e, char *xml) }static int +nft_rule_expr_cmp_snprintf_json (char *buf,size_t size,struct nft_expr_cmp *cmp) +{ +int len = size, offset =0 , ret; + + ret =snprintf (buf, len,"\"sreg\" : %u, \"op\" : \"%s\", \"cmpdata\" : {" , + cmp->sreg, expr_cmp_str[cmp->op]); +SNPRINTF_BUFFER_SIZE (ret, size, len, offset); + + ret =nft_data_reg_snprintf (buf+offset, len, &cmp->data, +NFT_RULE_O_JSON ,0 ,DATA_VALUE ); +SNPRINTF_BUFFER_SIZE (ret, size, len, offset); + + ret =snprintf (buf+offset, len,"}" ); +SNPRINTF_BUFFER_SIZE (ret, size, len, offset); + +return offset; +} + +static int nft_rule_expr_cmp_snprintf_xml (char *buf,size_t size,struct nft_expr_cmp *cmp) {int len = size, offset =0 , ret;
@@ -306,10 +325,12 @@ nft_rule_expr_cmp_snprintf(char *buf, size_t size, uint32_t type, {struct nft_expr_cmp *cmp = (struct nft_expr_cmp *)e->data;switch (type) { -case NFT_RULE_O_XML : -return nft_rule_expr_cmp_snprintf_xml (buf, size, cmp);case NFT_RULE_O_DEFAULT :return nft_rule_expr_cmp_snprintf_default (buf, size, cmp); +case NFT_RULE_O_XML : +return nft_rule_expr_cmp_snprintf_xml (buf, size, cmp); +case NFT_RULE_O_JSON : +return nft_rule_expr_cmp_snprintf_json (buf, size, cmp);default :break ; }
src/expr/counter.c +5 -2
@@ -194,11 +194,14 @@ nft_rule_expr_counter_snprintf(char *buf, size_t len, uint32_t type,struct nft_expr_counter *ctr = (struct nft_expr_counter *)e->data;switch (type) { +case NFT_RULE_O_DEFAULT : +return snprintf (buf, len,"pkts=%lu bytes=%lu " , + ctr->pkts, ctr->bytes);case NFT_RULE_O_XML :return snprintf (buf, len,"<pkts>%lu</pkts><bytes>%lu</bytes>" , ctr->pkts, ctr->bytes); -case NFT_RULE_O_DEFAULT : -return snprintf (buf, len,"pkts=%lu bytes=%lu " , +case NFT_RULE_O_JSON : +return snprintf (buf, len,"\"pkts\" : %lu, \"bytes\" : %lu" , ctr->pkts, ctr->bytes);default :break ;
src/expr/ct.c +5 -0
@@ -279,6 +279,11 @@ nft_rule_expr_ct_snprintf(char *buf, size_t len, uint32_t type,"<key>%s</key>" "<dir>%u</dir>" , ct->dreg, ctkey2str(ct->key), ct->dir); +case NFT_RULE_O_JSON : +return snprintf (buf, len,"\"dreg\" : %u, " +"\"key\" : \"%s\", " +"\"dir\" : %u" , + ct->dreg,ctkey2str (ct->key), ct->dir);default :break ; }
src/expr/data_reg.c +58 -7
100 lines not on this page · raw message
src/expr/exthdr.c +11 -5
@@ -325,6 +325,10 @@ nft_rule_expr_exthdr_snprintf(char *buf, size_t len, uint32_t type,struct nft_expr_exthdr *exthdr = (struct nft_expr_exthdr *)e->data;switch (type) { +case NFT_RULE_O_DEFAULT : +return snprintf (buf, len,"dreg=%u type=%u offset=%u len=%u " , + exthdr->dreg, exthdr->type, + exthdr->offset, exthdr->len);case NFT_RULE_O_XML :return snprintf (buf, len,"<dreg>%u</dreg>" "<exthdr_type>%s</exthdr_type>"
@@ -333,11 +337,13 @@ nft_rule_expr_exthdr_snprintf(char *buf, size_t len, uint32_t type, exthdr->dreg,exthdr_type2str (exthdr->type), exthdr->offset, exthdr->len); - -case NFT_RULE_O_DEFAULT : -return snprintf (buf, len,"dreg=%u type=%u offset=%u len=%u " , - exthdr->dreg, exthdr->type, - exthdr->offset, exthdr->len); +case NFT_RULE_O_JSON : +return snprintf (buf, len,"\"dreg\" : %u, " +"\"exthdr_type\" : \"%s\", \"offset\" : %u, " +"\"len\" : %u" , + exthdr->dreg, +exthdr_type2str (exthdr->type), + exthdr->offset, exthdr->len);default :break ; }
src/expr/immediate.c +38 -2
@@ -300,6 +300,40 @@ nft_rule_expr_immediate_xml_parse(struct nft_rule_expr *e, char *xml) }static int +nft_rule_expr_immediate_snprintf_json (char *buf,size_t len, +struct nft_rule_expr *e,uint32_t flags) +{ +int size = len, offset =0 , ret; +struct nft_expr_immediate *imm = (struct nft_expr_immediate *)e->data; + + ret =snprintf (buf, len,"\"dreg\" : %u, " +"\"immediatedata\" : {" , 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_RULE_O_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_RULE_O_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_RULE_O_JSON , flags,DATA_CHAIN ); +SNPRINTF_BUFFER_SIZE (ret, size, len, offset); + } + + ret =snprintf (buf+offset, len,"}" ); +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) {
@@ -367,10 +401,12 @@ nft_rule_expr_immediate_snprintf(char *buf, size_t len, uint32_t type, uint32_t flags, struct nft_rule_expr *e) { switch(type) { - case NFT_RULE_O_XML: - return nft_rule_expr_immediate_snprintf_xml(buf, len, e, flags); case NFT_RULE_O_DEFAULT: return nft_rule_expr_immediate_snprintf_default(buf, len, e, flags); +case NFT_RULE_O_XML : +return nft_rule_expr_immediate_snprintf_xml (buf, len, e, flags); +case NFT_RULE_O_JSON : +return nft_rule_expr_immediate_snprintf_json (buf, len, e, flags);default :break ; }
src/expr/limit.c +4 -0
@@ -195,6 +195,10 @@ nft_rule_expr_limit_snprintf(char *buf, size_t len, uint32_t type,return snprintf (buf, len,"<rate>%" PRIu64"</rate>" "<depth>%" PRIu64"</depth>" , limit->rate, limit->depth); +case NFT_RULE_O_JSON : +return snprintf (buf, len,"\"rate\" : %" PRIu64", " +"\"depth\" : %" PRIu64" " , + limit->rate, limit->depth);default :break ; }
src/expr/log.c +7 -0
@@ -263,6 +263,13 @@ nft_rule_expr_log_snprintf(char *buf, size_t len, uint32_t type,"<qthreshold>%u</qthreshold>" , log->prefix, log->group, log->snaplen, log->qthreshold); +case NFT_RULE_O_JSON : +return snprintf (buf, len,"\"prefix\" : \"%s\", " +"\"group\" : %u, " +"\"snaplen\" : %u, " +"\"qthreshold\" : %u " , + log->prefix, log->group, + log->snaplen, log->qthreshold);default :break ; }
src/expr/lookup.c +18 -2
@@ -239,6 +239,20 @@ nft_rule_expr_lookup_xml_parse(struct nft_rule_expr *e, char *xml) }static int +nft_rule_expr_lookup_snprintf_json (char *buf,size_t size, +struct nft_expr_lookup *l) +{ +int len = size, offset =0 , ret; + + ret =snprintf (buf, len,"\"set\" : \"%s\", \"sreg\" : %u, \"dreg\" : %u" , + l->set_name, l->sreg, l->dreg); +SNPRINTF_BUFFER_SIZE (ret, size, len, offset); + +return offset; +} + + +static int nft_rule_expr_lookup_snprintf_xml (char *buf,size_t size,struct nft_expr_lookup *l) {
@@ -271,10 +285,12 @@ nft_rule_expr_lookup_snprintf(char *buf, size_t size, uint32_t type,struct nft_expr_lookup *lookup = (struct nft_expr_lookup *)e->data;switch (type) { -case NFT_RULE_O_XML : -return nft_rule_expr_lookup_snprintf_xml (buf, size, lookup);case NFT_RULE_O_DEFAULT :return nft_rule_expr_lookup_snprintf_default (buf, size, lookup); +case NFT_RULE_O_XML : +return nft_rule_expr_lookup_snprintf_xml (buf, size, lookup); +case NFT_RULE_O_JSON : +return nft_rule_expr_lookup_snprintf_json (buf, size, lookup);default :break ; }
src/expr/match.c +16 -2
@@ -226,6 +226,18 @@ static int nft_rule_expr_match_xml_parse(struct nft_rule_expr *e, char *xml)#endif } +static int nft_rule_expr_match_snprintf_json (char *buf,size_t len, +struct nft_expr_match *mt) +{ +int ret, size = len, offset =0 ; + + ret =snprintf (buf, len,"\"name\" : \"%s\"" , + mt->name); +SNPRINTF_BUFFER_SIZE (ret, size, len, offset); + +return offset; +} +static int nft_rule_expr_match_snprintf_xml (char *buf,size_t len,struct nft_expr_match *mt) {
@@ -246,11 +258,13 @@ nft_rule_expr_match_snprintf(char *buf, size_t len, uint32_t type,struct nft_expr_match *match = (struct nft_expr_match *)e->data;switch (type) { -case NFT_RULE_O_XML : -return nft_rule_expr_match_snprintf_xml (buf, len, match);case NFT_RULE_O_DEFAULT :return snprintf (buf, len,"name=%s rev=%u " , match->name, match->rev); +case NFT_RULE_O_XML : +return nft_rule_expr_match_snprintf_xml (buf, len, match); +case NFT_RULE_O_JSON : +return nft_rule_expr_match_snprintf_json (buf, len, match);default :break ; }
src/expr/meta.c +7 -3
@@ -246,13 +246,17 @@ nft_rule_expr_meta_snprintf(char *buf, size_t len, uint32_t type,struct nft_expr_meta *meta = (struct nft_expr_meta *)e->data;switch (type) { +case NFT_RULE_O_DEFAULT : +return snprintf (buf, len,"dreg=%u key=%u " , + meta->dreg, meta->key);case NFT_RULE_O_XML :return snprintf (buf, len,"<dreg>%u</dreg>" "<key>%s</key>" , meta->dreg,meta_key2str (meta->key)); -case NFT_RULE_O_DEFAULT : -return snprintf (buf, len,"dreg=%u key=%u " , - meta->dreg, meta->key); +case NFT_RULE_O_JSON : +return snprintf (buf, len,"\"dreg\" : %u, " +"\"key\" : %s" , + meta->dreg,meta_key2str (meta->key));default :break ; }
src/expr/nat.c +42 -2
58 lines not on this page · raw message
src/expr/payload.c +36 -3
@@ -167,6 +167,36 @@ nft_rule_expr_payload_parse(struct nft_rule_expr *e, struct nlattr *attr) }static int +nft_rule_expr_payload_snprintf_json (char *buf,size_t len,uint32_t flags, +struct nft_expr_payload *p) +{ +int size = len, offset =0 , ret; + + ret =snprintf (buf, len,"\"dreg\" : %u, \"offset\" : %u, \"len\" : %u, " , + p->dreg, p->offset, p->len); +SNPRINTF_BUFFER_SIZE (ret, size, len, offset); + +switch (p->base) { +case NFT_PAYLOAD_LL_HEADER : + ret =snprintf (buf+offset, len,"\"base\" : \"link\"" ); +break ; +case NFT_PAYLOAD_NETWORK_HEADER : + ret =snprintf (buf+offset, len,"\"base\" : \"network\"" ); +break ; +case NFT_PAYLOAD_TRANSPORT_HEADER : + ret =snprintf (buf+offset, len,"\"base\" : \"transport\"" ); +break ; +default : + ret =snprintf (buf+offset, len,"\"base\" : \"unknown\"" ); +break ; + } + +SNPRINTF_BUFFER_SIZE (ret, size, len, offset); + +return offset; +} + +static int nft_rule_expr_payload_xml_parse (struct nft_rule_expr *e,char *xml) {#ifdef XML_PARSING
@@ -304,13 +334,16 @@ nft_rule_expr_payload_snprintf(char *buf, size_t len, uint32_t type,struct nft_expr_payload *payload = (struct nft_expr_payload *)e->data;switch (type) { -case NFT_RULE_O_XML : -return nft_rule_expr_payload_snprintf_xml (buf, len, flags, - payload);case NFT_RULE_O_DEFAULT :return snprintf (buf, len,"dreg=%u base=%u offset=%u len=%u " , payload->dreg, payload->base, payload->offset, payload->len); +case NFT_RULE_O_XML : +return nft_rule_expr_payload_snprintf_xml (buf, len, flags, + payload); +case NFT_RULE_O_JSON : +return nft_rule_expr_payload_snprintf_json (buf, len, flags, + payload);default :break ; }
src/expr/target.c +17 -2
@@ -228,6 +228,19 @@ nft_rule_expr_target_xml_parse(struct nft_rule_expr *e, char *xml) }static +int nft_rule_exp_target_snprintf_json (char *buf,size_t len, +struct nft_expr_target *tg) +{ +int ret, size = len, offset =0 ; + + ret =snprintf (buf, len,"\"name\" : \"%s\"" , + tg->name); +SNPRINTF_BUFFER_SIZE (ret, size, len, offset); + +return offset; +} + +static int nft_rule_exp_target_snprintf_xml (char *buf,size_t len,struct nft_expr_target *tg) {
@@ -247,11 +260,13 @@ nft_rule_expr_target_snprintf(char *buf, size_t len, uint32_t type,struct nft_expr_target *target = (struct nft_expr_target *)e->data;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); +case NFT_RULE_O_XML : +return nft_rule_exp_target_snprintf_xml (buf, len, target); +case NFT_RULE_O_JSON : +return nft_rule_exp_target_snprintf_json (buf, len, target);default :break ; }
src/internal.h +1 -0
@@ -22,6 +22,7 @@#define NFT_RULE_XML_VERSION 0#define NFT_TABLE_JSON_VERSION 0#define NFT_CHAIN_JSON_VERSION 0 +#define NFT_RULE_JSON_VERSION 0const char *nft_family2str (uint32_t family);int nft_str2family (const char *family);
src/rule.c +50 -2
66 lines not on this page · raw message
src/table.c +2 -2
@@ -367,12 +367,12 @@ int nft_table_snprintf(char *buf, size_t size, struct nft_table *t, uint32_t type, uint32_t flags) {switch (type) { +case NFT_TABLE_O_DEFAULT : +return nft_table_snprintf_default (buf, size, t);case NFT_TABLE_O_XML :return nft_table_snprintf_xml (buf, size, t);case NFT_TABLE_O_JSON :return nft_table_snprintf_json (buf, size, t); -case NFT_TABLE_O_DEFAULT : -return nft_table_snprintf_default (buf, size, t);default :break ; }
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [libnftables PATCH 1/2] Add function for exporting rule to JSON format and Order the switch values in the right order
Applied, thanks Alvaro.
PATCH 2/2 Add code for testing the new functions for exporting rules to JSON Format
In reply to Alvaro NeiraFrom: Álvaro Neira Ayuso <[email protected]>
--- examples/nft-rule-get.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
examples/nft-rule-get.c +4 -1
@@ -54,8 +54,11 @@ int main(int argc, char *argv[])struct nft_rule *t =NULL ;int ret; -if (argc ==2 &&strcmp (argv[1 ],"xml" ) ==0 ) +if (argc ==2 &&strcmp (argv[1 ],"xml" ) ==0 ){ type =NFT_RULE_O_XML ; + }else if (argc ==2 &&strcmp (argv[1 ],"json" ) ==0 ){ + type =NFT_RULE_O_JSON ; + }/* XXX requires table, chain and handle attributes for selective get */
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Pablo Neira Ayuso
maintainerRe: [libnftables PATCH 2/2] Add code for testing the new functions for exporting rules to JSON Format
Also applied, thanks.