| 253 | } |
| 254 | |
| 255 | void |
| 256 | pf_remove_if_empty_kruleset(struct pf_kruleset *ruleset) |
| 257 | { |
| 258 | struct pf_kanchor *parent; |
| 259 | int i; |
| 260 | |
| 261 | while (ruleset != NULL) { |
| 262 | if (ruleset == &pf_main_ruleset || ruleset->anchor == NULL || |
| 263 | !RB_EMPTY(&ruleset->anchor->children) || |
| 264 | ruleset->anchor->refcnt > 0 || ruleset->tables > 0 || |
| 265 | ruleset->topen) |
| 266 | return; |
| 267 | for (i = 0; i < PF_RULESET_MAX; ++i) |
| 268 | if (!TAILQ_EMPTY(ruleset->rules[i].active.ptr) || |
| 269 | !TAILQ_EMPTY(ruleset->rules[i].inactive.ptr) || |
| 270 | ruleset->rules[i].inactive.open) |
| 271 | return; |
| 272 | RB_REMOVE(pf_kanchor_global, &V_pf_anchors, ruleset->anchor); |
| 273 | if ((parent = ruleset->anchor->parent) != NULL) |
| 274 | RB_REMOVE(pf_kanchor_node, &parent->children, |
| 275 | ruleset->anchor); |
| 276 | rs_free(ruleset->anchor); |
| 277 | if (parent == NULL) |
| 278 | return; |
| 279 | ruleset = &parent->ruleset; |
| 280 | } |
| 281 | } |
| 282 | |
| 283 | int |
| 284 | pf_kanchor_setup(struct pf_krule *r, const struct pf_kruleset *s, |
no outgoing calls
no test coverage detected