summaryrefslogtreecommitdiff
path: root/sbin/pfctl/pfctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'sbin/pfctl/pfctl.c')
-rw-r--r--sbin/pfctl/pfctl.c38
1 files changed, 27 insertions, 11 deletions
diff --git a/sbin/pfctl/pfctl.c b/sbin/pfctl/pfctl.c
index 1f0deda6ef1..1bc461d5dcc 100644
--- a/sbin/pfctl/pfctl.c
+++ b/sbin/pfctl/pfctl.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pfctl.c,v 1.297 2010/06/25 23:27:47 henning Exp $ */
+/* $OpenBSD: pfctl.c,v 1.298 2010/06/28 23:21:41 mcbride Exp $ */
/*
* Copyright (c) 2001 Daniel Hartmeier
@@ -61,7 +61,7 @@
void usage(void);
int pfctl_enable(int, int);
int pfctl_disable(int, int);
-int pfctl_clear_stats(int, int);
+int pfctl_clear_stats(int, const char *, int);
int pfctl_clear_interface_flags(int, int);
int pfctl_clear_rules(int, int, char *);
int pfctl_clear_altq(int, int);
@@ -281,12 +281,23 @@ pfctl_disable(int dev, int opts)
}
int
-pfctl_clear_stats(int dev, int opts)
+pfctl_clear_stats(int dev, const char *iface, int opts)
{
- if (ioctl(dev, DIOCCLRSTATUS))
+ struct pfioc_iface pi;
+
+ memset(&pi, 0, sizeof(pi));
+ if (iface != NULL && strlcpy(pi.pfiio_name, iface,
+ sizeof(pi.pfiio_name)) >= sizeof(pi.pfiio_name))
+ errx(1, "invalid interface: %s", iface);
+
+ if (ioctl(dev, DIOCCLRSTATUS, &pi))
err(1, "DIOCCLRSTATUS");
- if ((opts & PF_OPT_QUIET) == 0)
- fprintf(stderr, "pf: statistics cleared\n");
+ if ((opts & PF_OPT_QUIET) == 0) {
+ fprintf(stderr, "pf: statistics cleared");
+ if (iface != NULL)
+ fprintf(stderr, " for interface %s", iface);
+ fprintf(stderr, "\n");
+ }
return (0);
}
@@ -1582,11 +1593,11 @@ pfctl_set_logif(struct pfctl *pf, char *ifname)
int
pfctl_load_logif(struct pfctl *pf, char *ifname)
{
- struct pfioc_if pi;
+ struct pfioc_iface pi;
memset(&pi, 0, sizeof(pi));
- if (ifname && strlcpy(pi.ifname, ifname,
- sizeof(pi.ifname)) >= sizeof(pi.ifname)) {
+ if (ifname && strlcpy(pi.pfiio_name, ifname,
+ sizeof(pi.pfiio_name)) >= sizeof(pi.pfiio_name)) {
warnx("pfctl_load_logif: strlcpy");
return (1);
}
@@ -2131,16 +2142,21 @@ main(int argc, char *argv[])
pfctl_clear_src_nodes(dev, opts);
break;
case 'i':
- pfctl_clear_stats(dev, opts);
+ pfctl_clear_stats(dev, ifaceopt, opts);
break;
case 'a':
pfctl_clear_rules(dev, opts, anchorname);
pfctl_clear_tables(anchorname, opts);
+ if (*ifaceopt) {
+ warnx("don't specify an interface with -Fall");
+ usage();
+ /* NOTREACHED */
+ }
if (!*anchorname) {
pfctl_clear_altq(dev, opts);
pfctl_clear_states(dev, ifaceopt, opts);
pfctl_clear_src_nodes(dev, opts);
- pfctl_clear_stats(dev, opts);
+ pfctl_clear_stats(dev, ifaceopt, opts);
pfctl_clear_fingerprints(dev, opts);
pfctl_clear_interface_flags(dev, opts);
}