aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorKristof Provost <kp@FreeBSD.org>2024-01-04 12:45:56 +0000
committerKristof Provost <kp@FreeBSD.org>2024-01-04 22:10:44 +0000
commit324fd7ec40439e6b3916429a69956d7acf74eb19 (patch)
tree44d165d05672e8b51f4101485acf07543e6fdc67 /lib
parent66cacc141d372fdfa624a380bac6880ecf809994 (diff)
Diffstat (limited to 'lib')
-rw-r--r--lib/libpfctl/libpfctl.c29
-rw-r--r--lib/libpfctl/libpfctl.h3
2 files changed, 26 insertions, 6 deletions
diff --git a/lib/libpfctl/libpfctl.c b/lib/libpfctl/libpfctl.c
index 94949a5a7337..2db3f0ede99f 100644
--- a/lib/libpfctl/libpfctl.c
+++ b/lib/libpfctl/libpfctl.c
@@ -1117,19 +1117,36 @@ int
pfctl_add_rule(int dev __unused, const struct pfctl_rule *r, const char *anchor,
const char *anchor_call, uint32_t ticket, uint32_t pool_ticket)
{
+ struct pfctl_handle *h;
+ int ret;
+
+ h = pfctl_open(PF_DEVICE);
+ if (h == NULL)
+ return (ENODEV);
+
+ ret = pfctl_add_rule_h(h, r, anchor, anchor_call, ticket, pool_ticket);
+
+ pfctl_close(h);
+
+ return (ret);
+}
+
+int
+pfctl_add_rule_h(struct pfctl_handle *h, const struct pfctl_rule *r,
+ const char *anchor, const char *anchor_call, uint32_t ticket,
+ uint32_t pool_ticket)
+{
struct snl_writer nw;
- struct snl_state ss = {};
struct snl_errmsg_data e = {};
struct nlmsghdr *hdr;
uint32_t seq_id;
int family_id;
- snl_init(&ss, NETLINK_GENERIC);
- family_id = snl_get_genl_family(&ss, PFNL_FAMILY_NAME);
+ family_id = snl_get_genl_family(&h->ss, PFNL_FAMILY_NAME);
if (family_id == 0)
return (ENOTSUP);
- snl_init_writer(&ss, &nw);
+ snl_init_writer(&h->ss, &nw);
hdr = snl_create_genl_msg_request(&nw, family_id, PFNL_CMD_ADDRULE);
hdr->nlmsg_flags |= NLM_F_DUMP;
snl_add_msg_attr_u32(&nw, PF_ART_TICKET, ticket);
@@ -1144,10 +1161,10 @@ pfctl_add_rule(int dev __unused, const struct pfctl_rule *r, const char *anchor,
seq_id = hdr->nlmsg_seq;
- if (! snl_send_message(&ss, hdr))
+ if (! snl_send_message(&h->ss, hdr))
return (ENXIO);
- while ((hdr = snl_read_reply_multi(&ss, seq_id, &e)) != NULL) {
+ while ((hdr = snl_read_reply_multi(&h->ss, seq_id, &e)) != NULL) {
}
return (e.error);
diff --git a/lib/libpfctl/libpfctl.h b/lib/libpfctl/libpfctl.h
index f128e5340891..cd72d04d6715 100644
--- a/lib/libpfctl/libpfctl.h
+++ b/lib/libpfctl/libpfctl.h
@@ -421,6 +421,9 @@ int pfctl_get_clear_rule(int dev, uint32_t nr, uint32_t ticket,
int pfctl_add_rule(int dev, const struct pfctl_rule *r,
const char *anchor, const char *anchor_call, uint32_t ticket,
uint32_t pool_ticket);
+int pfctl_add_rule_h(struct pfctl_handle *h, const struct pfctl_rule *r,
+ const char *anchor, const char *anchor_call, uint32_t ticket,
+ uint32_t pool_ticket);
int pfctl_set_keepcounters(int dev, bool keep);
int pfctl_get_creatorids(struct pfctl_handle *h, uint32_t *creators, size_t *len);