From: Patrick McHardy Date: Fri, 14 Dec 2012 16:30:06 +0000 (+0100) Subject: netlink: fix query requests X-Git-Tag: v0.099~142 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1c494b5302b285d6674478a3555b63403bebdcb0;p=thirdparty%2Fnftables.git netlink: fix query requests The callback needs to be set before sending the query since nl_wait_for_ack() already does message reception. Signed-off-by: Patrick McHardy --- diff --git a/src/netlink.c b/src/netlink.c index 912dfd5b..7e4f4906 100644 --- a/src/netlink.c +++ b/src/netlink.c @@ -372,9 +372,10 @@ int netlink_get_rule(struct netlink_ctx *ctx, const struct handle *h) int err; nlr = alloc_nft_rule(h); - nfnl_nft_rule_query(nf_sock, nlr, 0); netlink_set_callback(netlink_get_rule_cb, ctx); - err = nl_recvmsgs_default(nf_sock); + err = nfnl_nft_rule_query(nf_sock, nlr, 0); + if (err == 0) + err = nl_recvmsgs_default(nf_sock); nfnl_nft_rule_put(nlr); if (err < 0) @@ -504,9 +505,11 @@ int netlink_get_chain(struct netlink_ctx *ctx, const struct handle *h) int err; nlc = alloc_nft_chain(h); - nfnl_nft_chain_query(nf_sock, nlc, 0); netlink_set_callback(netlink_get_chain_cb, ctx); - err = nl_recvmsgs_default(nf_sock); + err = nfnl_nft_chain_query(nf_sock, nlc, 0); + if (err == 0) + err = nl_recvmsgs_default(nf_sock); + netlink_set_callback(NULL, NULL); nfnl_nft_chain_put(nlc); if (err < 0) @@ -606,9 +609,10 @@ int netlink_get_table(struct netlink_ctx *ctx, const struct handle *h) int err; nlt = alloc_nft_table(h); - nfnl_nft_table_query(nf_sock, nlt, 0); netlink_set_callback(netlink_get_table_cb, ctx); - err = nl_recvmsgs_default(nf_sock); + err = nfnl_nft_table_query(nf_sock, nlt, 0); + if (err == 0) + err = nl_recvmsgs_default(nf_sock); nfnl_nft_table_put(nlt); if (err < 0)