]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
bpf: Always open /dev/bpf directly
authorRoy Marples <roy@marples.name>
Thu, 13 Apr 2023 16:43:11 +0000 (17:43 +0100)
committerRoy Marples <roy@marples.name>
Thu, 13 Apr 2023 16:43:11 +0000 (17:43 +0100)
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

index e4b56f3dfc22dda5f9ef0f7547f6335cbf96d10e..b75bfb04ca3f1b68392152e655f0b5a025451c9f 100644 (file)
--- 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;