summaryrefslogtreecommitdiffstats
path: root/source/n/dhcpcd/patches/257259dd79d103f23342b1f0a3d608571a0ad549.patch
diff options
context:
space:
mode:
Diffstat (limited to 'source/n/dhcpcd/patches/257259dd79d103f23342b1f0a3d608571a0ad549.patch')
-rw-r--r--source/n/dhcpcd/patches/257259dd79d103f23342b1f0a3d608571a0ad549.patch75
1 files changed, 75 insertions, 0 deletions
diff --git a/source/n/dhcpcd/patches/257259dd79d103f23342b1f0a3d608571a0ad549.patch b/source/n/dhcpcd/patches/257259dd79d103f23342b1f0a3d608571a0ad549.patch
new file mode 100644
index 000000000..0ce8fa817
--- /dev/null
+++ b/source/n/dhcpcd/patches/257259dd79d103f23342b1f0a3d608571a0ad549.patch
@@ -0,0 +1,75 @@
+From 257259dd79d103f23342b1f0a3d608571a0ad549 Mon Sep 17 00:00:00 2001
+From: Roy Marples <roy@marples.name>
+Date: Thu, 13 Apr 2023 17:43:11 +0100
+Subject: [PATCH] bpf: Always open /dev/bpf directly
+
+Ignore _PATH_BPF as that's really a NetBSDism.
+If /dev/bpf throws a wobbly then try /dev/bpfN for older kernels.
+
+This allows cloning BPF on more BSD systems.
+---
+ src/bpf.c | 36 +++++++++++++++++-------------------
+ 1 file changed, 17 insertions(+), 19 deletions(-)
+
+diff --git a/src/bpf.c b/src/bpf.c
+index e4b56f3d..b75bfb04 100644
+--- a/src/bpf.c
++++ b/src/bpf.c
+@@ -45,7 +45,6 @@
+
+ #include <errno.h>
+ #include <fcntl.h>
+-#include <paths.h>
+ #include <stddef.h>
+ #include <stdlib.h>
+ #include <string.h>
+@@ -155,6 +154,11 @@ bpf_open(const struct interface *ifp,
+ struct bpf_version pv = { .bv_major = 0, .bv_minor = 0 };
+ struct ifreq ifr = { .ifr_flags = 0 };
+ int ibuf_len = 0;
++#ifdef O_CLOEXEC
++#define BPF_OPEN_FLAGS O_RDWR | O_NONBLOCK | O_CLOEXEC
++#else
++#define BPF_OPEN_FLAGS O_RDWR | O_NONBLOCK
++#endif
+ #ifdef BIOCIMMEDIATE
+ unsigned int flags;
+ #endif
+@@ -167,25 +171,19 @@ bpf_open(const struct interface *ifp,
+ return NULL;
+ bpf->bpf_ifp = ifp;
+
+-#ifdef _PATH_BPF
+- bpf->bpf_fd = open(_PATH_BPF, O_RDWR | O_NONBLOCK
+-#ifdef O_CLOEXEC
+- | O_CLOEXEC
+-#endif
+- );
+-#else
+- char device[32];
+- int n = 0;
++ /* /dev/bpf is a cloner on modern kernels */
++ bpf->bpf_fd = open("/dev/bpf", BPF_OPEN_FLAGS);
+
+- do {
+- snprintf(device, sizeof(device), "/dev/bpf%d", n++);
+- bpf->bpf_fd = open(device, O_RDWR | O_NONBLOCK
+-#ifdef O_CLOEXEC
+- | O_CLOEXEC
+-#endif
+- );
+- } while (bpf->bpf_fd == -1 && errno == EBUSY);
+-#endif
++ /* Support older kernels where /dev/bpf is not a cloner */
++ if (bpf->bpf_fd == -1) {
++ char device[32];
++ int n = 0;
++
++ do {
++ snprintf(device, sizeof(device), "/dev/bpf%d", n++);
++ bpf->bpf_fd = open(device, BPF_OPEN_FLAGS);
++ } while (bpf->bpf_fd == -1 && errno == EBUSY);
++ }
+
+ if (bpf->bpf_fd == -1)
+ goto eexit;