diff options
Diffstat (limited to 'source/n/dhcpcd/patches')
-rw-r--r-- | source/n/dhcpcd/patches/257259dd79d103f23342b1f0a3d608571a0ad549.patch | 75 |
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; |