summaryrefslogtreecommitdiffstats
path: root/sbin/pfctl/pfctl_parser.c
diff options
context:
space:
mode:
authorbz <bz@FreeBSD.org>2013-12-26 15:51:14 +0000
committerbz <bz@FreeBSD.org>2013-12-26 15:51:14 +0000
commit0310caaafd2fa5770408b7081e6501147f193692 (patch)
tree2db9293406846e872866698cc1dad29bfc8b1918 /sbin/pfctl/pfctl_parser.c
parent44f33e00e6fcd8e397d99aa46cdc0dd0c5c32c95 (diff)
downloadFreeBSD-src-0310caaafd2fa5770408b7081e6501147f193692.zip
FreeBSD-src-0310caaafd2fa5770408b7081e6501147f193692.tar.gz
Use feature_present(3) to determine whether to open an INET or an
INET6 socket when needed to allow pfctl to work on noinet and noinet6 kernels (and try to provide a fallback using AF_LINK as best effort). Adjust the Makefile to also respect relevant src.conf(5) options for compile time decisions on INET and INET6 support. Reviewed by: glebius (no objections) MFC after: 1 week
Diffstat (limited to 'sbin/pfctl/pfctl_parser.c')
-rw-r--r--sbin/pfctl/pfctl_parser.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/sbin/pfctl/pfctl_parser.c b/sbin/pfctl/pfctl_parser.c
index f248995..1f4375a 100644
--- a/sbin/pfctl/pfctl_parser.c
+++ b/sbin/pfctl/pfctl_parser.c
@@ -1231,6 +1231,26 @@ ifa_load(void)
freeifaddrs(ifap);
}
+int
+get_socket_domain(void)
+{
+ int sdom;
+
+ sdom = AF_UNSPEC;
+#ifdef WITH_INET6
+ if (sdom == AF_UNSPEC && feature_present("inet6"))
+ sdom = AF_INET6;
+#endif
+#ifdef WITH_INET
+ if (sdom == AF_UNSPEC && feature_present("inet"))
+ sdom = AF_INET;
+#endif
+ if (sdom == AF_UNSPEC)
+ sdom = AF_LINK;
+
+ return (sdom);
+}
+
struct node_host *
ifa_exists(const char *ifa_name)
{
@@ -1242,7 +1262,7 @@ ifa_exists(const char *ifa_name)
ifa_load();
/* check wether this is a group */
- if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
+ if ((s = socket(get_socket_domain(), SOCK_DGRAM, 0)) == -1)
err(1, "socket");
bzero(&ifgr, sizeof(ifgr));
strlcpy(ifgr.ifgr_name, ifa_name, sizeof(ifgr.ifgr_name));
@@ -1273,7 +1293,7 @@ ifa_grouplookup(const char *ifa_name, int flags)
int s, len;
struct node_host *n, *h = NULL;
- if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
+ if ((s = socket(get_socket_domain(), SOCK_DGRAM, 0)) == -1)
err(1, "socket");
bzero(&ifgr, sizeof(ifgr));
strlcpy(ifgr.ifgr_name, ifa_name, sizeof(ifgr.ifgr_name));
OpenPOWER on IntegriCloud