src: xml: add versioning
PATCH v2 1/1 src: xml: add versioning
All XML chunks now have a "version" attribute to help in future changes.
Signed-off-by Arturo Borrero Gonzalez <[email protected]>
--- src/chain.c | 18 +++++++++++++++--- src/internal.h | 4 ++++ src/rule.c | 17 +++++++++++++++-- src/table.c | 18 ++++++++++++++++-- 4 files changed, 50 insertions(+), 7 deletions(-)
src/chain.c +15 -3
@@ -14,6 +14,7 @@#include <endian.h> #include <stdint.h> #include <stdlib.h> +#include <limits.h> #include <string.h> #include <netinet/in.h> #include <errno.h>
@@ -469,6 +470,17 @@ static int nft_chain_xml_parse(struct nft_chain *c, char *xml)if (tree ==NULL )return -1 ; +/* Validate version */ +if (mxmlElementGetAttr (tree,"version" ) ==NULL ) { +mxmlDelete (tree); +return -1 ; + } + tmp =strtoll (mxmlElementGetAttr (tree,"version" ), &endptr,10 ); +if (tmp ==LLONG_MAX || *endptr || tmp !=NFT_CHAIN_XML_VERSION ) { +mxmlDelete (tree); +return -1 ; + } +/* Get and set <chain name="xxx" ... >*/ if (mxmlElementGetAttr (tree,"name" ) ==NULL ) {mxmlDelete (tree);
@@ -643,7 +655,7 @@ static int nft_chain_snprintf_xml(char *buf, size_t size, struct nft_chain *c) {return snprintf (buf, size,"<chain name=\"%s\" handle=\"%lu\"" -" bytes=\"%lu\" packets=\"%lu\">" +" bytes=\"%lu\" packets=\"%lu\" version=\"%d\" >" "<properties>" "<type>%s</type>" "<table>%s</table>"
@@ -655,8 +667,8 @@ static int nft_chain_snprintf_xml(char *buf, size_t size, struct nft_chain *c)"</properties>" "</chain>" , c->name, c->handle, c->bytes, c->packets, - c->type, c->table, c->prio, c->use, c->hooknum, - c->policy, c->family); +NFT_CHAIN_XML_VERSION , c->type, c->table, + c->prio, c->use, c->hooknum, c->policy, c->family); }static int nft_chain_snprintf_default (char *buf,size_t size,struct nft_chain *c)
src/internal.h +4 -0
@@ -17,6 +17,10 @@#include <mxml.h> #endif +#define NFT_TABLE_XML_VERSION 0 +#define NFT_CHAIN_XML_VERSION 0 +#define NFT_RULE_XML_VERSION 0 +struct expr_ops ;struct nft_rule_expr {
src/rule.c +15 -2
@@ -14,6 +14,7 @@#include <endian.h> #include <stdint.h> #include <stdlib.h> +#include <limits.h> #include <string.h> #include <netinet/in.h> #include <errno.h>
@@ -454,6 +455,17 @@ static int nft_rule_xml_parse(struct nft_rule *r, char *xml)if (tree ==NULL )return -1 ; +/* validate XML version <rule ... version=X ... > */ +if (mxmlElementGetAttr (tree,"version" ) ==NULL ) { +mxmlDelete (tree); +return -1 ; + } + tmp =strtoll (mxmlElementGetAttr (tree,"version" ), &endptr,10 ); +if (tmp ==LLONG_MAX || *endptr || tmp !=NFT_RULE_XML_VERSION ) { +mxmlDelete (tree); +return -1 ; + } +/* get and set <rule ... family=X ... > */ if (mxmlElementGetAttr (tree,"family" ) ==NULL ) {mxmlDelete (tree);
@@ -629,9 +641,10 @@ static int nft_rule_snprintf_xml(char *buf, size_t size, struct nft_rule *r, ret =snprintf (buf, size,"<rule family=\"%u\" table=\"%s\" " -"chain=\"%s\" handle=\"%llu\"> " , +"chain=\"%s\" handle=\"%llu\" version=\"%d\"> " , r->family, r->table, r->chain, - (unsigned long long )r->handle); + (unsigned long long )r->handle, +NFT_RULE_XML_VERSION );SNPRINTF_BUFFER_SIZE (ret, size, len, offset); ret = snprintf(buf+offset, len, "<rule_flags>%u</rule_flags>"
src/table.c +16 -2
@@ -203,6 +203,7 @@ static int nft_table_xml_parse(struct nft_table *t, char *xml)mxml_node_t *node =NULL ;char *endptr =NULL ;uint64_t tmp; +int64_t stmp;/* NOTE: all XML nodes are mandatory */
@@ -211,6 +212,18 @@ static int nft_table_xml_parse(struct nft_table *t, char *xml)if (tree ==NULL )return -1 ; +/* Check the version of the XML */ +if (mxmlElementGetAttr (tree,"version" ) ==NULL ) { +mxmlDelete (tree); +return -1 ; + } + + stmp =strtoll (mxmlElementGetAttr (tree,"version" ), &endptr,10 ); +if (stmp ==LLONG_MAX || *endptr || stmp !=NFT_TABLE_XML_VERSION ) { +mxmlDelete (tree); +return -1 ; + } +/* Get and set the name of the table */ if (mxmlElementGetAttr (tree,"name" ) ==NULL ) {mxmlDelete (tree);
@@ -290,13 +303,14 @@ EXPORT_SYMBOL(nft_table_parse);static int nft_table_snprintf_xml (char *buf,size_t size,struct nft_table *t) {return snprintf (buf, size, -"<table name=\"%s\">" +"<table name=\"%s\" version=\"%d\">" "<properties>" "<family>%u</family>" "<table_flags>%d</table_flags>" "</properties>" "</table>" , - t->name, t->family, t->table_flags); + t->name,NFT_TABLE_XML_VERSION , + t->family, t->table_flags); }static int nft_table_snprintf_default (char *buf,size_t size,struct nft_table *t)
2013/5/27 Arturo Borrero <[email protected]>:
Quoted 9 lines
All XML chunks now have a "version" attribute to help in future changes.
Signed-off-by Arturo Borrero Gonzalez <[email protected]>--- src/chain.c | 18 +++++++++++++++--- src/internal.h | 4 ++++ src/rule.c | 17 +++++++++++++++-- src/table.c | 18 ++++++++++++++++-- 4 files changed, 50 insertions(+), 7 deletions(-)
Hi,
I see this at patchwork as accepted, but is not in git.netfilter.org.
http://patchwork.ozlabs.org/patch/246629/
should I continue working with 'version' attributes?
regards.
--
Arturo Borrero González
--
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