return 0;
}
+static void flush_rule_cache(struct nft_handle *h)
+{
+ if (!h->rule_cache)
+ return;
+
+ nftnl_rule_list_free(h->rule_cache);
+ h->rule_cache = NULL;
+}
+
void nft_fini(struct nft_handle *h)
{
+ flush_rule_cache(h);
mnl_socket_close(h->nl);
free(mnl_nlmsg_batch_head(h->batch));
mnl_nlmsg_batch_stop(h->batch);
if (batch_rule_add(h, type, r) < 0)
nftnl_rule_free(r);
+ flush_rule_cache(h);
return 1;
}
struct nftnl_rule_list *list;
int ret;
+ if (h->rule_cache)
+ return h->rule_cache;
+
list = nftnl_rule_list_alloc();
if (list == NULL)
return 0;
return NULL;
}
+ h->rule_cache = list;
return list;
}
}
nftnl_rule_list_iter_destroy(iter);
- nftnl_rule_list_free(list);
/* the core expects 1 for success and 0 for error */
return 1;
}
nftnl_chain_list_iter_destroy(iter);
+ flush_rule_cache(h);
err:
nftnl_chain_list_free(list);
if (ret == 0)
errno = ENOENT;
- nftnl_rule_list_free(list);
-
return ret;
}
} else
errno = ENOENT;
- nftnl_rule_list_free(list);
+ flush_rule_cache(h);
return ret;
}
return 0;
}
+ flush_rule_cache(h);
return 1;
}
r = nft_rule_find(h, list, chain, table, data,
rulenum - 1);
if (r != NULL) {
- nftnl_rule_list_free(list);
+ flush_rule_cache(h);
return nft_rule_append(h, chain, table, data,
0, verbose);
}
handle = nftnl_rule_get_u64(r, NFTNL_RULE_HANDLE);
DEBUGP("adding after rule handle %"PRIu64"\n", handle);
- nftnl_rule_list_free(list);
+ flush_rule_cache(h);
}
return nft_rule_add(h, chain, table, data, handle, verbose);
err:
- nftnl_rule_list_free(list);
+ flush_rule_cache(h);
return 0;
}
} else
errno = ENOENT;
- nftnl_rule_list_free(list);
+ flush_rule_cache(h);
return ret;
}
} else
errno = ENOENT;
- nftnl_rule_list_free(list);
+ flush_rule_cache(h);
return ret;
}
nftnl_rule_list_iter_destroy(iter);
err:
- nftnl_rule_list_free(list);
-
if (ret == 0)
errno = ENOENT;
false);
error:
- nftnl_rule_list_free(list);
+ flush_rule_cache(h);
return ret;
}