Move chain cache population from nft_chain_list_get() into a dedicated function. Signed-off-by: Phil Sutter <phil@xxxxxx> --- iptables/nft.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/iptables/nft.c b/iptables/nft.c index 09308d6757b54..d25e37fb2b232 100644 --- a/iptables/nft.c +++ b/iptables/nft.c @@ -1295,20 +1295,12 @@ err: return MNL_CB_OK; } -struct nftnl_chain_list *nft_chain_list_get(struct nft_handle *h, - const char *table) +static int fetch_chain_cache(struct nft_handle *h) { char buf[16536]; struct nlmsghdr *nlh; - const struct builtin_table *t; int i, ret; - t = nft_table_builtin_find(h, table); - if (!t) - return NULL; - - if (h->table[t->type].chain_cache) - return h->table[t->type].chain_cache; retry: for (i = 0; i < NFT_TABLE_MAX; i++) { enum nft_table_type type = h->tables[i].type; @@ -1318,7 +1310,7 @@ retry: h->table[type].chain_cache = nftnl_chain_list_alloc(); if (!h->table[type].chain_cache) - return NULL; + return -1; } nlh = nftnl_chain_nlmsg_build_hdr(buf, NFT_MSG_GETCHAIN, h->family, @@ -1331,6 +1323,21 @@ retry: goto retry; } + return ret; +} + +struct nftnl_chain_list *nft_chain_list_get(struct nft_handle *h, + const char *table) +{ + const struct builtin_table *t; + + t = nft_table_builtin_find(h, table); + if (!t) + return NULL; + + if (!h->table[t->type].chain_cache) + fetch_chain_cache(h); + return h->table[t->type].chain_cache; } -- 2.19.0