summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2013-07-13 21:21:27 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2013-07-13 21:35:23 +0200
commit4dd0772911a2c92a43d4e4aecf305fba498be106 (patch)
tree0b40bca77b673de3102c8466d6b25ce07711fb99
parent013227cb6f13cbab2fbccbeb750199a051fd7a43 (diff)
expr: use __attribute__((constructor)) to register expression
Instead of manual array registration. Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r--src/expr/bitwise.c5
-rw-r--r--src/expr/byteorder.c5
-rw-r--r--src/expr/cmp.c4
-rw-r--r--src/expr/counter.c5
-rw-r--r--src/expr/ct.c5
-rw-r--r--src/expr/exthdr.c5
-rw-r--r--src/expr/immediate.c5
-rw-r--r--src/expr/limit.c5
-rw-r--r--src/expr/log.c5
-rw-r--r--src/expr/lookup.c5
-rw-r--r--src/expr/match.c5
-rw-r--r--src/expr/meta.c5
-rw-r--r--src/expr/nat.c5
-rw-r--r--src/expr/payload.c5
-rw-r--r--src/expr/target.c5
-rw-r--r--src/expr_ops.c49
-rw-r--r--src/expr_ops.h3
-rw-r--r--src/internal.h2
18 files changed, 89 insertions, 39 deletions
diff --git a/src/expr/bitwise.c b/src/expr/bitwise.c
index da601f9..7ea5376 100644
--- a/src/expr/bitwise.c
+++ b/src/expr/bitwise.c
@@ -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);
+}
diff --git a/src/expr/byteorder.c b/src/expr/byteorder.c
index 1e6a51b..53283c1 100644
--- a/src/expr/byteorder.c
+++ b/src/expr/byteorder.c
@@ -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);
+}
diff --git a/src/expr/cmp.c b/src/expr/cmp.c
index 3f795bc..f49261f 100644
--- a/src/expr/cmp.c
+++ b/src/expr/cmp.c
@@ -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);
+}
diff --git a/src/expr/counter.c b/src/expr/counter.c
index 171088d..e32a46c 100644
--- a/src/expr/counter.c
+++ b/src/expr/counter.c
@@ -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);
+}
diff --git a/src/expr/ct.c b/src/expr/ct.c
index 655a935..8ca2167 100644
--- a/src/expr/ct.c
+++ b/src/expr/ct.c
@@ -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);
+}
diff --git a/src/expr/exthdr.c b/src/expr/exthdr.c
index eddcd00..a89d17b 100644
--- a/src/expr/exthdr.c
+++ b/src/expr/exthdr.c
@@ -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);
+}
diff --git a/src/expr/immediate.c b/src/expr/immediate.c
index 847d0c4..1aa937b 100644
--- a/src/expr/immediate.c
+++ b/src/expr/immediate.c
@@ -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);
+}
diff --git a/src/expr/limit.c b/src/expr/limit.c
index c18ca2a..cce74ce 100644
--- a/src/expr/limit.c
+++ b/src/expr/limit.c
@@ -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);
+}
diff --git a/src/expr/log.c b/src/expr/log.c
index 03be030..94e2908 100644
--- a/src/expr/log.c
+++ b/src/expr/log.c
@@ -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);
+}
diff --git a/src/expr/lookup.c b/src/expr/lookup.c
index 9babfd1..9495ab0 100644
--- a/src/expr/lookup.c
+++ b/src/expr/lookup.c
@@ -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);
+}
diff --git a/src/expr/match.c b/src/expr/match.c
index 01d8cef..8bc2878 100644
--- a/src/expr/match.c
+++ b/src/expr/match.c
@@ -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);
+}
diff --git a/src/expr/meta.c b/src/expr/meta.c
index 3b83a4a..ceb7af2 100644
--- a/src/expr/meta.c
+++ b/src/expr/meta.c
@@ -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);
+}
diff --git a/src/expr/nat.c b/src/expr/nat.c
index 66ae405..5ba2f4d 100644
--- a/src/expr/nat.c
+++ b/src/expr/nat.c
@@ -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);
+}
diff --git a/src/expr/payload.c b/src/expr/payload.c
index 539b157..7ae356b 100644
--- a/src/expr/payload.c
+++ b/src/expr/payload.c
@@ -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);
+}
diff --git a/src/expr/target.c b/src/expr/target.c
index fc24a81..15e167b 100644
--- a/src/expr/target.c
+++ b/src/expr/target.c
@@ -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);
+}
diff --git a/src/expr_ops.c b/src/expr_ops.c
index da4c194..d0315a3 100644
--- a/src/expr_ops.c
+++ b/src/expr_ops.c
@@ -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;
diff --git a/src/expr_ops.h b/src/expr_ops.h
index 18edfd1..d8a0b36 100644
--- a/src/expr_ops.h
+++ b/src/expr_ops.h
@@ -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
diff --git a/src/internal.h b/src/internal.h
index 803dcc4..773643b 100644
--- a/src/internal.h
+++ b/src/internal.h
@@ -78,4 +78,6 @@ struct nft_set_elem {
#define div_round_up(n, d) (((n) + (d) - 1) / (d))
+#define __init __attribute__((constructor))
+
#endif