From 4dd0772911a2c92a43d4e4aecf305fba498be106 Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Sat, 13 Jul 2013 21:21:27 +0200 Subject: expr: use __attribute__((constructor)) to register expression Instead of manual array registration. Signed-off-by: Pablo Neira Ayuso --- src/expr/bitwise.c | 5 +++++ src/expr/byteorder.c | 5 +++++ src/expr/cmp.c | 4 ++++ src/expr/counter.c | 5 +++++ src/expr/ct.c | 5 +++++ src/expr/exthdr.c | 5 +++++ src/expr/immediate.c | 5 +++++ src/expr/limit.c | 5 +++++ src/expr/log.c | 5 +++++ src/expr/lookup.c | 5 +++++ src/expr/match.c | 5 +++++ src/expr/meta.c | 5 +++++ src/expr/nat.c | 5 +++++ src/expr/payload.c | 5 +++++ src/expr/target.c | 5 +++++ src/expr_ops.c | 49 ++++++++++--------------------------------------- src/expr_ops.h | 3 +++ src/internal.h | 2 ++ 18 files changed, 89 insertions(+), 39 deletions(-) (limited to 'src') 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 +#include #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 -- cgit v1.2.3