]> git.ipfire.org Git - thirdparty/libnftnl.git/commitdiff
src: add interface to parse from file
authorArturo Borrero <arturo.borrero.glez@gmail.com>
Thu, 9 Jan 2014 11:19:12 +0000 (12:19 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Thu, 9 Jan 2014 16:19:46 +0000 (17:19 +0100)
This patch adds a new API to parse rule-set expressed in XML/JSON from
a file. A new enum nft_parse_input type is added for this purpose.

Signed-off-by: Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
15 files changed:
include/libnftables/chain.h
include/libnftables/rule.h
include/libnftables/ruleset.h
include/libnftables/set.h
include/libnftables/table.h
src/chain.c
src/internal.h
src/jansson.c
src/libnftables.map
src/mxml.c
src/rule.c
src/ruleset.c
src/set.c
src/set_elem.c
src/table.c

index dec1a77b367a3de6dadd5250322a0742421908ed..d213bf1a634deb8c4157753dde5b5fed8d4a5772 100644 (file)
@@ -53,6 +53,8 @@ void nft_chain_nlmsg_build_payload(struct nlmsghdr *nlh, const struct nft_chain
 
 int nft_chain_parse(struct nft_chain *c, enum nft_parse_type type,
                    const char *data, struct nft_parse_err *err);
+int nft_chain_parse_file(struct nft_chain *c, enum nft_parse_type type,
+                        FILE *fp, struct nft_parse_err *err);
 int nft_chain_snprintf(char *buf, size_t size, struct nft_chain *t, uint32_t type, uint32_t flags);
 int nft_chain_fprintf(FILE *fp, struct nft_chain *c, uint32_t type, uint32_t flags);
 
index 15102037d1e55ec84fa2c17f2d2cf5b99a72f21b..48b9974431ea7752680da0c0ac45f5b4b3f618af 100644 (file)
@@ -49,6 +49,8 @@ void nft_rule_nlmsg_build_payload(struct nlmsghdr *nlh, struct nft_rule *t);
 
 int nft_rule_parse(struct nft_rule *r, enum nft_parse_type type,
                   const char *data, struct nft_parse_err *err);
+int nft_rule_parse_file(struct nft_rule *r, enum nft_parse_type type,
+                       FILE *fp, struct nft_parse_err *err);
 int nft_rule_snprintf(char *buf, size_t size, struct nft_rule *t, uint32_t type, uint32_t flags);
 int nft_rule_fprintf(FILE *fp, struct nft_rule *r, uint32_t type, uint32_t flags);
 
index b523346b8612130dde976b0f438870a10275b2af..f916fba1653617c16a8101f8200b3a3a376048a2 100644 (file)
@@ -32,6 +32,8 @@ const void *nft_ruleset_attr_get(const struct nft_ruleset *r, uint16_t attr);
 
 int nft_ruleset_parse(struct nft_ruleset *rs, enum nft_parse_type type,
                      const char *data, struct nft_parse_err *err);
+int nft_ruleset_parse_file(struct nft_ruleset *rs, enum nft_parse_type type,
+                          FILE *fp, struct nft_parse_err *err);
 int nft_ruleset_snprintf(char *buf, size_t size, const struct nft_ruleset *rs, uint32_t type, uint32_t flags);
 int nft_ruleset_fprintf(FILE *fp, const struct nft_ruleset *rs, uint32_t type, uint32_t flags);
 
index 97117295c0485ae2a94fa8a30751d12b39a106f3..c4b1ff6fdc5423aafbac4e701a3285d7dfd7e9af 100644 (file)
@@ -62,6 +62,8 @@ void nft_set_list_iter_destroy(struct nft_set_list_iter *iter);
 
 int nft_set_parse(struct nft_set *s, enum nft_parse_type type,
                  const char *data, struct nft_parse_err *err);
+int nft_set_parse_file(struct nft_set *s, enum nft_parse_type type,
+                      FILE *fp, struct nft_parse_err *err);
 
 /*
  * Set elements
@@ -101,6 +103,8 @@ int nft_set_elem_nlmsg_parse(const struct nlmsghdr *nlh, struct nft_set_elem *s)
 
 int nft_set_elem_parse(struct nft_set_elem *e, enum nft_parse_type type,
                       const char *data, struct nft_parse_err *err);
+int nft_set_elem_parse_file(struct nft_set_elem *e, enum nft_parse_type type,
+                           FILE *fp, struct nft_parse_err *err);
 int nft_set_elem_snprintf(char *buf, size_t size, struct nft_set_elem *s, uint32_t type, uint32_t flags);
 int nft_set_elem_fprintf(FILE *fp, struct nft_set_elem *se, uint32_t type, uint32_t flags);
 
index 80f2349f43099a459a80bf1d558dc659852e98ff..64fbf88c26279d390a58702c76f72ab7bdb72d70 100644 (file)
@@ -41,6 +41,8 @@ void nft_table_nlmsg_build_payload(struct nlmsghdr *nlh, const struct nft_table
 
 int nft_table_parse(struct nft_table *t, enum nft_parse_type type,
                    const char *data, struct nft_parse_err *err);
+int nft_table_parse_file(struct nft_table *t, enum nft_parse_type type,
+                        FILE *fp, struct nft_parse_err *err);
 int nft_table_snprintf(char *buf, size_t size, struct nft_table *t, uint32_t type, uint32_t flags);
 int nft_table_fprintf(FILE *fp, struct nft_table *t, uint32_t type, uint32_t flags);
 
index 8f40ede9e5efe648a7a683d52df5dbd490b3dacc..18a52da8638cc6c90f9a1213a66089b60075b10d 100644 (file)
@@ -761,6 +761,13 @@ int nft_chain_parse(struct nft_chain *c, enum nft_parse_type type,
 }
 EXPORT_SYMBOL(nft_chain_parse);
 
+int nft_chain_parse_file(struct nft_chain *c, enum nft_parse_type type,
+                        FILE *fp, struct nft_parse_err *err)
+{
+       return nft_chain_do_parse(c, type, fp, err, NFT_PARSE_FILE);
+}
+EXPORT_SYMBOL(nft_chain_parse_file);
+
 static int nft_chain_snprintf_json(char *buf, size_t size, struct nft_chain *c)
 {
        int ret, len = size, offset = 0;
index fa092cf86507bfafa7ce1280dd6eeb305ac1a740..d3c58a2b7be7801ab7aa9e6c7c5cbe970d449c3f 100644 (file)
@@ -40,6 +40,7 @@ struct nft_parse_err {
 
 enum nft_parse_input {
        NFT_PARSE_BUFFER,
+       NFT_PARSE_FILE,
 };
 
 #ifdef XML_PARSING
index 3428f2f31beed9ac2fdd1f81ac482ba9ac0ac792..f446e175a9724c341c26dbd4efac9323e1310d19 100644 (file)
@@ -98,6 +98,9 @@ json_t *nft_jansson_create_root(const void *json, json_error_t *error,
        case NFT_PARSE_BUFFER:
                root = json_loadb(json, strlen(json), 0, error);
                break;
+       case NFT_PARSE_FILE:
+               root = json_loadf((FILE *)json, 0, error);
+               break;
        default:
                goto err;
        }
index be5c783ec3493865d7a838710253bf26ffa43d89..faf0913ac2c0e5a6b89ed7469d5c8d3a0e5d7479 100644 (file)
@@ -13,6 +13,7 @@ global:
   nft_table_attr_get_u32;
   nft_table_attr_get_str;
   nft_table_parse;
+  nft_table_parse_file;
   nft_table_snprintf;
   nft_table_fprintf;
   nft_table_nlmsg_build_payload;
@@ -45,6 +46,7 @@ global:
   nft_chain_attr_get_u64;
   nft_chain_attr_get_str;
   nft_chain_parse;
+  nft_chain_parse_file;
   nft_chain_snprintf;
   nft_chain_fprintf;
   nft_chain_nlmsg_build_payload;
@@ -74,6 +76,7 @@ global:
   nft_rule_attr_get_u64;
   nft_rule_attr_get_str;
   nft_rule_parse;
+  nft_rule_parse_file;
   nft_rule_snprintf;
   nft_rule_fprintf;
   nft_rule_nlmsg_build_payload;
@@ -128,6 +131,7 @@ global:
   nft_set_nlmsg_build_payload;
   nft_set_nlmsg_parse;
   nft_set_parse;
+  nft_set_parse_file;
   nft_set_snprintf;
   nft_set_fprintf;
 
@@ -159,6 +163,7 @@ global:
   nft_set_elem_nlmsg_build_payload;
   nft_set_elem_nlmsg_parse;
   nft_set_elem_parse;
+  nft_set_elem_parse_file;
   nft_set_elem_snprintf;
   nft_set_elem_fprinf;
 
@@ -179,6 +184,7 @@ global:
   nft_ruleset_attr_set;
   nft_ruleset_attr_get;
   nft_ruleset_parse;
+  nft_ruleset_parse_file;
   nft_ruleset_snprintf;
   nft_ruleset_fprintf;
 
index 575383c9920571519284f5db1080cbea3319c42b..ddbd01bfe09a685ef09afdb21fbd052522a1d980 100644 (file)
@@ -31,6 +31,9 @@ mxml_node_t *nft_mxml_build_tree(const void *data, const char *treename,
        case NFT_PARSE_BUFFER:
                tree = mxmlLoadString(NULL, data, MXML_OPAQUE_CALLBACK);
                break;
+       case NFT_PARSE_FILE:
+               tree = mxmlLoadFile(NULL, (FILE *)data, MXML_OPAQUE_CALLBACK);
+               break;
        default:
                goto err;
        }
index 081686c3aea597fbcb063006e153bf7c5dd31881..9b4b01f69053bcf2a48ca46a18dc542a5bcfa8b8 100644 (file)
@@ -678,6 +678,13 @@ int nft_rule_parse(struct nft_rule *r, enum nft_parse_type type,
 }
 EXPORT_SYMBOL(nft_rule_parse);
 
+int nft_rule_parse_file(struct nft_rule *r, enum nft_parse_type type,
+                       FILE *fp, struct nft_parse_err *err)
+{
+       return nft_rule_do_parse(r, type, fp, err, NFT_PARSE_FILE);
+}
+EXPORT_SYMBOL(nft_rule_parse_file);
+
 static int nft_rule_snprintf_json(char *buf, size_t size, struct nft_rule *r,
                                         uint32_t type, uint32_t flags)
 {
index c6bcc4b913962a8ef1c882e644c97256d69b3a1b..f5e1157d78541c6751d372c35a35675427000307 100644 (file)
@@ -597,6 +597,13 @@ int nft_ruleset_parse(struct nft_ruleset *r, enum nft_parse_type type,
 }
 EXPORT_SYMBOL(nft_ruleset_parse);
 
+int nft_ruleset_parse_file(struct nft_ruleset *rs, enum nft_parse_type type,
+                          FILE *fp, struct nft_parse_err *err)
+{
+       return nft_ruleset_do_parse(rs, type, fp, err, NFT_PARSE_FILE);
+}
+EXPORT_SYMBOL(nft_ruleset_parse_file);
+
 static const char *nft_ruleset_o_opentag(uint32_t type)
 {
        switch (type) {
index 1c9caf8aa2427ff2eda2eec3546cd1840024352e..822a7156ead1ca6e52e93bf3616769b3bb413ae0 100644 (file)
--- a/src/set.c
+++ b/src/set.c
@@ -376,7 +376,8 @@ err:
 #endif
 
 static int nft_set_json_parse(struct nft_set *s, const void *json,
-                             struct nft_parse_err *err, enum nft_parse_input input)
+                             struct nft_parse_err *err,
+                             enum nft_parse_input input)
 {
 #ifdef JSON_PARSING
        json_t *tree;
@@ -484,7 +485,8 @@ int nft_mxml_set_parse(mxml_node_t *tree, struct nft_set *s,
 #endif
 
 static int nft_set_xml_parse(struct nft_set *s, const void *xml,
-                            struct nft_parse_err *err, enum nft_parse_input input)
+                            struct nft_parse_err *err,
+                            enum nft_parse_input input)
 {
 #ifdef XML_PARSING
        int ret;
@@ -533,6 +535,13 @@ int nft_set_parse(struct nft_set *s, enum nft_parse_type type,
 }
 EXPORT_SYMBOL(nft_set_parse);
 
+int nft_set_parse_file(struct nft_set *s, enum nft_parse_type type,
+                      FILE *fp, struct nft_parse_err *err)
+{
+       return nft_set_do_parse(s, type, fp, err, NFT_PARSE_FILE);
+}
+EXPORT_SYMBOL(nft_set_parse_file);
+
 static int nft_set_snprintf_json(char *buf, size_t size, struct nft_set *s,
                                  uint32_t type, uint32_t flags)
 {
index 93e8291015dee5edac15838078e432b43a18c5c8..2bbfb0e2a62d8b85fae540b67f6dc0816b9098a5 100644 (file)
@@ -463,6 +463,13 @@ int nft_set_elem_parse(struct nft_set_elem *e, enum nft_parse_type type,
 }
 EXPORT_SYMBOL(nft_set_elem_parse);
 
+int nft_set_elem_parse_file(struct nft_set_elem *e, enum nft_parse_type type,
+                           FILE *fp, struct nft_parse_err *err)
+{
+       return nft_set_elem_do_parse(e, type, fp, err, NFT_PARSE_FILE);
+}
+EXPORT_SYMBOL(nft_set_elem_parse_file);
+
 static int nft_set_elem_snprintf_json(char *buf, size_t size,
                                      struct nft_set_elem *e, uint32_t flags)
 {
index 4f2d5d2c22392ef6e7befad16a91f27059fbb237..ad3570f19c39e853c092630eabb8f5cf2e7baa59 100644 (file)
@@ -355,6 +355,13 @@ int nft_table_parse(struct nft_table *t, enum nft_parse_type type,
 }
 EXPORT_SYMBOL(nft_table_parse);
 
+int nft_table_parse_file(struct nft_table *t, enum nft_parse_type type,
+                        FILE *fp, struct nft_parse_err *err)
+{
+       return nft_table_do_parse(t, type, fp, err, NFT_PARSE_FILE);
+}
+EXPORT_SYMBOL(nft_table_parse_file);
+
 static int nft_table_snprintf_json(char *buf, size_t size, struct nft_table *t)
 {
        return snprintf(buf, size,