Changeset View
Changeset View
Standalone View
Standalone View
lib/libpfctl/libpfctl.c
Show First 20 Lines • Show All 285 Lines • ▼ Show 20 Lines | pf_nvrule_to_rule(const nvlist_t *nvl, struct pfctl_rule *rule) | ||||
skip = nvlist_get_number_array(nvl, "skip", &skipcount); | skip = nvlist_get_number_array(nvl, "skip", &skipcount); | ||||
assert(skip); | assert(skip); | ||||
assert(skipcount == PF_SKIP_COUNT); | assert(skipcount == PF_SKIP_COUNT); | ||||
for (int i = 0; i < PF_SKIP_COUNT; i++) | for (int i = 0; i < PF_SKIP_COUNT; i++) | ||||
rule->skip[i].nr = skip[i]; | rule->skip[i].nr = skip[i]; | ||||
strlcpy(rule->label, nvlist_get_string(nvl, "label"), PF_RULE_LABEL_SIZE); | strlcpy(rule->label, nvlist_get_string(nvl, "label"), PF_RULE_LABEL_SIZE); | ||||
if (nvlist_exists_string(nvl, "schedule")) | |||||
strlcpy(rule->schedule, nvlist_get_string(nvl, "schedule"), | |||||
PF_RULE_LABEL_SIZE); | |||||
strlcpy(rule->ifname, nvlist_get_string(nvl, "ifname"), IFNAMSIZ); | strlcpy(rule->ifname, nvlist_get_string(nvl, "ifname"), IFNAMSIZ); | ||||
strlcpy(rule->qname, nvlist_get_string(nvl, "qname"), PF_QNAME_SIZE); | strlcpy(rule->qname, nvlist_get_string(nvl, "qname"), PF_QNAME_SIZE); | ||||
strlcpy(rule->pqname, nvlist_get_string(nvl, "pqname"), PF_QNAME_SIZE); | strlcpy(rule->pqname, nvlist_get_string(nvl, "pqname"), PF_QNAME_SIZE); | ||||
strlcpy(rule->tagname, nvlist_get_string(nvl, "tagname"), | strlcpy(rule->tagname, nvlist_get_string(nvl, "tagname"), | ||||
PF_TAG_NAME_SIZE); | PF_TAG_NAME_SIZE); | ||||
strlcpy(rule->match_tagname, nvlist_get_string(nvl, "match_tagname"), | strlcpy(rule->match_tagname, nvlist_get_string(nvl, "match_tagname"), | ||||
PF_TAG_NAME_SIZE); | PF_TAG_NAME_SIZE); | ||||
▲ Show 20 Lines • Show All 88 Lines • ▼ Show 20 Lines | libpfctl_add_rule(int dev, const struct pfctl_rule *r, const char *anchor, | ||||
nvlist_add_string(nvl, "anchor", anchor); | nvlist_add_string(nvl, "anchor", anchor); | ||||
nvlist_add_string(nvl, "anchor_call", anchor_call); | nvlist_add_string(nvl, "anchor_call", anchor_call); | ||||
nvlist_add_number(nvlr, "nr", r->nr); | nvlist_add_number(nvlr, "nr", r->nr); | ||||
pfctl_nv_add_rule_addr(nvlr, "src", &r->src); | pfctl_nv_add_rule_addr(nvlr, "src", &r->src); | ||||
pfctl_nv_add_rule_addr(nvlr, "dst", &r->dst); | pfctl_nv_add_rule_addr(nvlr, "dst", &r->dst); | ||||
nvlist_add_string(nvlr, "label", r->label); | nvlist_add_string(nvlr, "label", r->label); | ||||
nvlist_add_string(nvlr, "schedule", r->schedule); | |||||
nvlist_add_string(nvlr, "ifname", r->ifname); | nvlist_add_string(nvlr, "ifname", r->ifname); | ||||
nvlist_add_string(nvlr, "qname", r->qname); | nvlist_add_string(nvlr, "qname", r->qname); | ||||
nvlist_add_string(nvlr, "pqname", r->pqname); | nvlist_add_string(nvlr, "pqname", r->pqname); | ||||
nvlist_add_string(nvlr, "tagname", r->tagname); | nvlist_add_string(nvlr, "tagname", r->tagname); | ||||
nvlist_add_string(nvlr, "match_tagname", r->match_tagname); | nvlist_add_string(nvlr, "match_tagname", r->match_tagname); | ||||
nvlist_add_string(nvlr, "overload_tblname", r->overload_tblname); | nvlist_add_string(nvlr, "overload_tblname", r->overload_tblname); | ||||
pfctl_nv_add_pool(nvlr, "rpool", &r->rpool); | pfctl_nv_add_pool(nvlr, "rpool", &r->rpool); | ||||
▲ Show 20 Lines • Show All 117 Lines • ▼ Show 20 Lines | if (nvl == NULL) { | ||||
return (EIO); | return (EIO); | ||||
} | } | ||||
pf_nvrule_to_rule(nvlist_get_nvlist(nvl, "rule"), rule); | pf_nvrule_to_rule(nvlist_get_nvlist(nvl, "rule"), rule); | ||||
if (anchor_call) | if (anchor_call) | ||||
strlcpy(anchor_call, nvlist_get_string(nvl, "anchor_call"), | strlcpy(anchor_call, nvlist_get_string(nvl, "anchor_call"), | ||||
MAXPATHLEN); | MAXPATHLEN); | ||||
free(nv.data); | |||||
nvlist_destroy(nvl); | |||||
return (0); | |||||
} | |||||
int | |||||
libpfctl_kill_schedule(int dev, const char *sched, int *killed) | |||||
{ | |||||
struct pfioc_nv nv; | |||||
nvlist_t *nvl; | |||||
int ret; | |||||
nvl = nvlist_create(0); | |||||
nvlist_add_string(nvl, "schedule", sched); | |||||
nv.data = nvlist_pack(nvl, &nv.len); | |||||
nv.size = nv.len; // Reply will be smaller than the request | |||||
nvlist_destroy(nvl); | |||||
ret = ioctl(dev, DIOCKILLSCHEDULE, &nv); | |||||
if (ret != 0) { | |||||
free(nv.data); | |||||
return (ret); | |||||
} | |||||
nvl = nvlist_unpack(nv.data, nv.len, 0); | |||||
if (nvl == NULL) { | |||||
free(nv.data); | |||||
return (EIO); | |||||
} | |||||
if (killed) | |||||
*killed = nvlist_get_number(nvl, "killed"); | |||||
free(nv.data); | free(nv.data); | ||||
nvlist_destroy(nvl); | nvlist_destroy(nvl); | ||||
return (0); | return (0); | ||||
} | } |