]> git.ipfire.org Git - thirdparty/libnftnl.git/commitdiff
expr: use __attribute__((constructor)) to register expression
authorPablo Neira Ayuso <pablo@netfilter.org>
Sat, 13 Jul 2013 19:21:27 +0000 (21:21 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Sat, 13 Jul 2013 19:35:23 +0000 (21:35 +0200)
Instead of manual array registration.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
18 files changed:
src/expr/bitwise.c
src/expr/byteorder.c
src/expr/cmp.c
src/expr/counter.c
src/expr/ct.c
src/expr/exthdr.c
src/expr/immediate.c
src/expr/limit.c
src/expr/log.c
src/expr/lookup.c
src/expr/match.c
src/expr/meta.c
src/expr/nat.c
src/expr/payload.c
src/expr/target.c
src/expr_ops.c
src/expr_ops.h
src/internal.h

index da601f9603f457f7422018946e8f6f61fe04e73f..7ea5376396c7136eb464886c7a3676108c610f37 100644 (file)
@@ -360,3 +360,8 @@ struct expr_ops expr_ops_bitwise = {
        .snprintf       = nft_rule_expr_bitwise_snprintf,
        .xml_parse      = nft_rule_expr_bitwise_xml_parse,
 };
+
+static void __init expr_bitwise(void)
+{
+       nft_expr_ops_register(&expr_ops_bitwise);
+}
index 1e6a51b13de60ed7732d17af8df868d951e2a7b2..53283c1f3a4c14ddf97f1d93d8c48bd651decdd0 100644 (file)
@@ -356,3 +356,8 @@ struct expr_ops expr_ops_byteorder = {
        .snprintf       = nft_rule_expr_byteorder_snprintf,
        .xml_parse      = nft_rule_expr_byteorder_xml_parse,
 };
+
+static void __init expr_byteorder_init(void)
+{
+       nft_expr_ops_register(&expr_ops_byteorder);
+}
index 3f795bcafe3c4e578049603f4a78dc7f5b51d6ad..f49261f5ace046c72985ab7b39b7d9472fe72a00 100644 (file)
@@ -305,3 +305,7 @@ struct expr_ops expr_ops_cmp = {
        .snprintf       = nft_rule_expr_cmp_snprintf,
        .xml_parse      = nft_rule_expr_cmp_xml_parse,
 };
+static void __init expr_cmp_init(void)
+{
+       nft_expr_ops_register(&expr_ops_cmp);
+}
index 171088d69374155a10d0a44bdfda0446ae840c5b..e32a46ca3028dad935f830d719fd49bb13f473d2 100644 (file)
@@ -201,3 +201,8 @@ struct expr_ops expr_ops_counter = {
        .snprintf       = nft_rule_expr_counter_snprintf,
        .xml_parse      = nft_rule_expr_counter_xml_parse,
 };
+
+static void __init expr_counter_init(void)
+{
+       nft_expr_ops_register(&expr_ops_counter);
+}
index 655a935f1311dacfed111f6cbe31569238087ea2..8ca2167429228ae6b8c5b497e14784808e929cf8 100644 (file)
@@ -281,3 +281,8 @@ struct expr_ops expr_ops_ct = {
        .snprintf       = nft_rule_expr_ct_snprintf,
        .xml_parse      = nft_rule_expr_ct_xml_parse,
 };
+
+static void __init expr_ct_init(void)
+{
+       nft_expr_ops_register(&expr_ops_ct);
+}
index eddcd00085151ac3935f6fa425c6d9f284c2c59c..a89d17ba7c4c694ff741998c45b6bd7c6cc42779 100644 (file)
@@ -317,3 +317,8 @@ struct expr_ops expr_ops_exthdr = {
        .snprintf       = nft_rule_expr_exthdr_snprintf,
        .xml_parse      = nft_rule_expr_exthdr_xml_parse,
 };
+
+static void __init expr_exthdr_init(void)
+{
+       nft_expr_ops_register(&expr_ops_exthdr);
+}
index 847d0c467489583f542515733068fca654f734d9..1aa937b98bbde8019452e654d6d9c516db55c532 100644 (file)
@@ -360,3 +360,8 @@ struct expr_ops expr_ops_immediate = {
        .snprintf       = nft_rule_expr_immediate_snprintf,
        .xml_parse      = nft_rule_expr_immediate_xml_parse,
 };
+
+static void __init expr_immediate_init(void)
+{
+       nft_expr_ops_register(&expr_ops_immediate);
+}
index c18ca2a6768bc7a26c174f61ad18531529b5f97f..cce74ce4a9e638ba69a1c40f89fff911dd29a6c2 100644 (file)
@@ -203,3 +203,8 @@ struct expr_ops expr_ops_limit = {
        .snprintf       = nft_rule_expr_limit_snprintf,
        .xml_parse      = nft_rule_expr_limit_xml_parse,
 };
+
+static void __init expr_limit_init(void)
+{
+       nft_expr_ops_register(&expr_ops_limit);
+}
index 03be03085e1d64332ab7a22ce2f4a33584d09d6d..94e29088b3952cc09c40b1285087e732b1b54a95 100644 (file)
@@ -274,3 +274,8 @@ struct expr_ops expr_ops_log = {
        .snprintf       = nft_rule_expr_log_snprintf,
        .xml_parse      = nft_rule_expr_log_xml_parse,
 };
+
+static void __init expr_log_init(void)
+{
+       nft_expr_ops_register(&expr_ops_log);
+}
index 9babfd12354b98844195d6149024876c9057c543..9495ab0975812e9f8b441f133fef2d43bf845496 100644 (file)
@@ -261,3 +261,8 @@ struct expr_ops expr_ops_lookup = {
        .snprintf       = nft_rule_expr_lookup_snprintf,
        .xml_parse      = nft_rule_expr_lookup_xml_parse,
 };
+
+static void __init expr_lookup_init(void)
+{
+       nft_expr_ops_register(&expr_ops_lookup);
+}
index 01d8cef9bfa3c31bbaaa20c8c284fd854ffc069d..8bc28785150ae21db8fe35a85c5fee85a2984227 100644 (file)
@@ -265,3 +265,8 @@ struct expr_ops expr_ops_match = {
        .snprintf       = nft_rule_expr_match_snprintf,
        .xml_parse = nft_rule_expr_match_xml_parse,
 };
+
+static void __init expr_match_init(void)
+{
+       nft_expr_ops_register(&expr_ops_match);
+}
index 3b83a4a73bf653aa3669e538af962feac5187af1..ceb7af250f95512a072328ec43ae7bdcf6cc2aef 100644 (file)
@@ -238,3 +238,8 @@ struct expr_ops expr_ops_meta = {
        .snprintf       = nft_rule_expr_meta_snprintf,
        .xml_parse = nft_rule_expr_meta_xml_parse,
 };
+
+static void __init expr_meta_init(void)
+{
+       nft_expr_ops_register(&expr_ops_meta);
+}
index 66ae40589e0182c5048083715962c76946e178bf..5ba2f4dea538d463eb1457da1428d11875745d5d 100644 (file)
@@ -420,3 +420,8 @@ struct expr_ops expr_ops_nat = {
        .snprintf       = nft_rule_expr_nat_snprintf,
        .xml_parse      = nft_rule_expr_nat_xml_parse,
 };
+
+static void __init expr_nat_init(void)
+{
+       nft_expr_ops_register(&expr_ops_nat);
+}
index 539b15737c29086484a7f923a5f0424a53656d73..7ae356b41a5f4f69cfb83ccb3ce92beb3166869e 100644 (file)
@@ -342,3 +342,8 @@ struct expr_ops expr_ops_payload = {
        .snprintf       = nft_rule_expr_payload_snprintf,
        .xml_parse      = nft_rule_expr_payload_xml_parse,
 };
+
+static void __init expr_payload_init(void)
+{
+       nft_expr_ops_register(&expr_ops_payload);
+}
index fc24a811a79c7e9e98f71a6ae7f217503fdeae28..15e167bbeb9d88432dd6b4e16980b0dc70b3c12e 100644 (file)
@@ -267,3 +267,8 @@ struct expr_ops expr_ops_target = {
        .snprintf       = nft_rule_expr_target_snprintf,
        .xml_parse      = nft_rule_expr_target_xml_parse,
 };
+
+static void __init expr_target_init(void)
+{
+       nft_expr_ops_register(&expr_ops_target);
+}
index da4c1943556514ef6e7ec094553b7c8afb48e033..d0315a34624a9057937baad5470079399ec21117 100644 (file)
@@ -1,51 +1,22 @@
 #include <string.h>
+#include <linux_list.h>
 
 #include "expr_ops.h"
 
-extern struct expr_ops expr_ops_bitwise;
-extern struct expr_ops expr_ops_byteorder;
-extern struct expr_ops expr_ops_cmp;
-extern struct expr_ops expr_ops_counter;
-extern struct expr_ops expr_ops_ct;
-extern struct expr_ops expr_ops_exthdr;
-extern struct expr_ops expr_ops_immediate;
-extern struct expr_ops expr_ops_limit;
-extern struct expr_ops expr_ops_log;
-extern struct expr_ops expr_ops_lookup;
-extern struct expr_ops expr_ops_match;
-extern struct expr_ops expr_ops_meta;
-extern struct expr_ops expr_ops_nat;
-extern struct expr_ops expr_ops_payload;
-extern struct expr_ops expr_ops_target;
+static LIST_HEAD(expr_ops_list);
 
-struct expr_ops *expr_ops[] = {
-       &expr_ops_bitwise,
-       &expr_ops_byteorder,
-       &expr_ops_cmp,
-       &expr_ops_counter,
-       &expr_ops_ct,
-       &expr_ops_exthdr,
-       &expr_ops_immediate,
-       &expr_ops_match,
-       &expr_ops_meta,
-       &expr_ops_nat,
-       &expr_ops_payload,
-       &expr_ops_target,
-       &expr_ops_limit,
-       &expr_ops_log,
-       &expr_ops_lookup,
-       NULL,
-};
+void nft_expr_ops_register(struct expr_ops *ops)
+{
+       list_add_tail(&ops->head, &expr_ops_list);
+}
 
 struct expr_ops *nft_expr_ops_lookup(const char *name)
 {
-       int i = 0;
-
-       while (expr_ops[i] != NULL) {
-               if (strcmp(expr_ops[i]->name, name) == 0)
-                       return expr_ops[i];
+       struct expr_ops *ops;
 
-               i++;
+       list_for_each_entry(ops, &expr_ops_list, head) {
+               if (strcmp(ops->name, name) == 0)
+                       return ops;
        }
 
        return NULL;
index 18edfd142ed8b2ab5e6df2cf327c5aaa38cb1bb6..d8a0b3689cfd9e80e08728535b3f57b3c86a2319 100644 (file)
@@ -14,6 +14,8 @@ struct nft_rule_expr;
 #endif
 
 struct expr_ops {
+       struct list_head head;
+
        char    *name;
        size_t  alloc_len;
        int     max_attr;
@@ -25,6 +27,7 @@ struct expr_ops {
        int     (*xml_parse)(struct nft_rule_expr *e, mxml_node_t *tree);
 };
 
+void nft_expr_ops_register(struct expr_ops *ops);
 struct expr_ops *nft_expr_ops_lookup(const char *name);
 
 #endif
index 803dcc487e8b0147cd634e9f5ad3e859fa828bb0..773643be7904b10cad60e0006ad60f94a2231f99 100644 (file)
@@ -78,4 +78,6 @@ struct nft_set_elem {
 
 #define div_round_up(n, d)     (((n) + (d) - 1) / (d))
 
+#define __init __attribute__((constructor))
+
 #endif