void netlink_rulelist(list rule_list, int cmd, bool force) { ip_rule_t *iprule; element e; /* No rules to add */ if (LIST_ISEMPTY(rule_list)) return; /* If force is set, we try to remove all the rules, but the * rule might not exist. That's not an error, so indicate not * to report such a situation */ if (force && cmd == IPRULE_DEL) netlink_error_ignore = ENOENT; for (e = LIST_HEAD(rule_list); e; ELEMENT_NEXT(e)) { iprule = ELEMENT_DATA(e); if (force || (cmd && !iprule->set) || (!cmd && iprule->set)) { if (netlink_rule(iprule, cmd) > 0) iprule->set = (cmd) ? 1 : 0; else iprule->set = 0; } } netlink_error_ignore = 0; }
void reinstate_static_rule(ip_rule_t *rule) { char buf[256]; rule->set = (netlink_rule(rule, IPRULE_ADD) > 0); format_iprule(rule, buf, sizeof(buf)); log_message(LOG_INFO, "Restoring deleted static rule %s", buf); }