From 283ea9e229fa362836992c61e4dcef4aef1a8564 Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Thu, 13 Jun 2013 21:15:05 +0200 Subject: src: add nft_*_list_foreach This patch adds a simplied iterator interface. Signed-off-by: Pablo Neira Ayuso --- src/chain.c | 16 ++++++++++++++++ src/libnftables.map | 8 ++++++++ src/rule.c | 32 ++++++++++++++++++++++++++++++++ src/set.c | 15 +++++++++++++++ src/set_elem.c | 16 ++++++++++++++++ src/table.c | 16 ++++++++++++++++ 6 files changed, 103 insertions(+) (limited to 'src') diff --git a/src/chain.c b/src/chain.c index 1c53daa..62a6ddd 100644 --- a/src/chain.c +++ b/src/chain.c @@ -801,6 +801,22 @@ void nft_chain_list_del(struct nft_chain *r) } EXPORT_SYMBOL(nft_chain_list_del); +int nft_chain_list_foreach(struct nft_chain_list *chain_list, + int (*cb)(struct nft_chain *r, void *data), + void *data) +{ + struct nft_chain *cur, *tmp; + int ret; + + list_for_each_entry_safe(cur, tmp, &chain_list->list, head) { + ret = cb(cur, data); + if (ret < 0) + return ret; + } + return 0; +} +EXPORT_SYMBOL(nft_chain_list_foreach); + struct nft_chain_list_iter { struct nft_chain_list *list; struct nft_chain *cur; diff --git a/src/libnftables.map b/src/libnftables.map index 2b31d55..6ee7a36 100644 --- a/src/libnftables.map +++ b/src/libnftables.map @@ -16,6 +16,7 @@ global: nft_table_nlmsg_parse; nft_table_list_alloc; nft_table_list_free; + nft_table_list_foreach; nft_table_list_add; nft_table_list_iter_create; nft_table_list_iter_next; @@ -43,6 +44,7 @@ global: nft_chain_list_free; nft_chain_list_add; nft_chain_list_del; + nft_chain_list_foreach; nft_chain_list_iter_create; nft_chain_list_iter_next; nft_chain_list_iter_destroy; @@ -66,6 +68,7 @@ global: nft_rule_nlmsg_parse; nft_rule_add_expr; + nft_rule_expr_foreach; nft_rule_expr_iter_create; nft_rule_expr_iter_next; nft_rule_expr_iter_destroy; @@ -87,6 +90,7 @@ global: nft_rule_list_alloc; nft_rule_list_free; nft_rule_list_add; + nft_rule_list_foreach; nft_rule_list_iter_create; nft_rule_list_iter_cur; nft_rule_list_iter_next; @@ -109,6 +113,7 @@ global: nft_set_list_alloc; nft_set_list_free; nft_set_list_add; + nft_set_list_foreach; nft_set_list_iter_create; nft_set_list_iter_cur; @@ -118,6 +123,7 @@ global: nft_set_elem_alloc; nft_set_elem_free; nft_set_elem_add; + nft_set_elem_foreach; nft_set_elem_attr_unset; nft_set_elem_attr_set; nft_set_elem_attr_set_u32; @@ -133,6 +139,8 @@ global: nft_set_elems_nlmsg_build_payload; nft_set_elems_nlmsg_parse; + nft_set_elems_foreach; + nft_set_elems_iter_create; nft_set_elems_iter_cur; nft_set_elems_iter_next; diff --git a/src/rule.c b/src/rule.c index 4c1672d..13b5a11 100644 --- a/src/rule.c +++ b/src/rule.c @@ -742,6 +742,22 @@ int nft_rule_snprintf(char *buf, size_t size, struct nft_rule *r, } EXPORT_SYMBOL(nft_rule_snprintf); +int nft_rule_expr_foreach(struct nft_rule *r, + int (*cb)(struct nft_rule_expr *e, void *data), + void *data) +{ + struct nft_rule_expr *cur, *tmp; + int ret; + + list_for_each_entry_safe(cur, tmp, &r->expr_list, head) { + ret = cb(cur, data); + if (ret < 0) + return ret; + } + return 0; +} +EXPORT_SYMBOL(nft_rule_expr_foreach); + struct nft_rule_expr_iter { struct nft_rule *r; struct nft_rule_expr *cur; @@ -817,6 +833,22 @@ void nft_rule_list_add(struct nft_rule *r, struct nft_rule_list *list) } EXPORT_SYMBOL(nft_rule_list_add); +int nft_rule_list_foreach(struct nft_rule_list *rule_list, + int (*cb)(struct nft_rule *r, void *data), + void *data) +{ + struct nft_rule *cur, *tmp; + int ret; + + list_for_each_entry_safe(cur, tmp, &rule_list->list, head) { + ret = cb(cur, data); + if (ret < 0) + return ret; + } + return 0; +} +EXPORT_SYMBOL(nft_rule_list_foreach); + struct nft_rule_list_iter { struct nft_rule_list *list; struct nft_rule *cur; diff --git a/src/set.c b/src/set.c index 8e8adad..4d16062 100644 --- a/src/set.c +++ b/src/set.c @@ -364,6 +364,21 @@ void nft_set_list_add(struct nft_set *s, struct nft_set_list *list) } EXPORT_SYMBOL(nft_set_list_add); +int nft_set_list_foreach(struct nft_set_list *set_list, + int (*cb)(struct nft_set *t, void *data), void *data) +{ + struct nft_set *cur, *tmp; + int ret; + + list_for_each_entry_safe(cur, tmp, &set_list->list, head) { + ret = cb(cur, data); + if (ret < 0) + return ret; + } + return 0; +} +EXPORT_SYMBOL(nft_set_list_foreach); + struct nft_set_list_iter { struct nft_set_list *list; struct nft_set *cur; diff --git a/src/set_elem.c b/src/set_elem.c index dae1f8c..209227f 100644 --- a/src/set_elem.c +++ b/src/set_elem.c @@ -396,6 +396,22 @@ int nft_set_elem_snprintf(char *buf, size_t size, struct nft_set_elem *e, } EXPORT_SYMBOL(nft_set_elem_snprintf); +int nft_set_elem_foreach(struct nft_set *s, + int (*cb)(struct nft_set_elem *e, void *data), + void *data) +{ + struct nft_set_elem *elem; + int ret; + + list_for_each_entry(elem, &s->element_list, head) { + ret = cb(elem, data); + if (ret < 0) + return ret; + } + return 0; +} +EXPORT_SYMBOL(nft_set_elem_foreach); + struct nft_set_elems_iter { struct list_head *list; struct nft_set_elem *cur; diff --git a/src/table.c b/src/table.c index f21a6ed..3e8d4c9 100644 --- a/src/table.c +++ b/src/table.c @@ -409,6 +409,22 @@ void nft_table_list_add(struct nft_table *r, struct nft_table_list *list) } EXPORT_SYMBOL(nft_table_list_add); +int nft_table_list_foreach(struct nft_table_list *table_list, + int (*cb)(struct nft_table *t, void *data), + void *data) +{ + struct nft_table *cur, *tmp; + int ret; + + list_for_each_entry_safe(cur, tmp, &table_list->list, head) { + ret = cb(cur, data); + if (ret < 0) + return ret; + } + return 0; +} +EXPORT_SYMBOL(nft_table_list_foreach); + struct nft_table_list_iter { struct nft_table_list *list; struct nft_table *cur; -- cgit v1.2.3