summaryrefslogtreecommitdiffstats
path: root/src/privsep-bpf.c
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2021-02-02 14:41:54 +0000
committerRoy Marples <roy@marples.name>2021-02-02 14:41:54 +0000
commit5d619328bf07da0b6b209ce12f22381a4fe435e0 (patch)
tree5ace2bdf2c31a21315447462ee10b4e1f9f12e64 /src/privsep-bpf.c
parentb042338612f18c9be8576c258006f94395db6297 (diff)
downloaddhcpcd-5d619328bf07da0b6b209ce12f22381a4fe435e0.tar.xz
eloop: Make the API more like native poll/kqueue/epoll
Just have the one callback, but return an abstracted event mask to work out if we can read/write have something else. Log diagnostics if the event mask is unexpected. While here add more logging if we fail to register an event to monitor.
Diffstat (limited to 'src/privsep-bpf.c')
-rw-r--r--src/privsep-bpf.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/src/privsep-bpf.c b/src/privsep-bpf.c
index f402ea18..f0088568 100644
--- a/src/privsep-bpf.c
+++ b/src/privsep-bpf.c
@@ -54,7 +54,7 @@
#include "privsep.h"
static void
-ps_bpf_recvbpf(void *arg)
+ps_bpf_recvbpf(void *arg, unsigned short events)
{
struct ps_process *psp = arg;
struct bpf *bpf = psp->psp_bpf;
@@ -65,6 +65,9 @@ ps_bpf_recvbpf(void *arg)
.ps_cmd = psp->psp_id.psi_cmd,
};
+ if (events != ELE_READ)
+ logerrx("%s: unexpected event 0x%04x", __func__, events);
+
bpf->bpf_flags &= ~BPF_EOF;
/* A BPF read can read more than one filtered packet at time.
* This mechanism allows us to read each packet from the buffer. */
@@ -131,11 +134,11 @@ ps_bpf_recvmsgcb(void *arg, struct ps_msghdr *psm, struct msghdr *msg)
}
static void
-ps_bpf_recvmsg(void *arg)
+ps_bpf_recvmsg(void *arg, unsigned short events)
{
struct ps_process *psp = arg;
- if (ps_recvpsmsg(psp->psp_ctx, psp->psp_fd,
+ if (ps_recvpsmsg(psp->psp_ctx, psp->psp_fd, events,
ps_bpf_recvmsgcb, arg) == -1)
logerr(__func__);
}
@@ -164,8 +167,8 @@ ps_bpf_start_bpf(void *arg)
else if (ps_rights_limit_fd(psp->psp_bpf->bpf_fd) == -1)
logerr("%s: ps_rights_limit_fd", __func__);
#endif
- else if (eloop_event_add(ctx->eloop,
- psp->psp_bpf->bpf_fd, ps_bpf_recvbpf, psp) == -1)
+ else if (eloop_event_add(ctx->eloop, psp->psp_bpf->bpf_fd, ELE_READ,
+ ps_bpf_recvbpf, psp) == -1)
logerr("%s: eloop_event_add", __func__);
else {
psp->psp_work_fd = psp->psp_bpf->bpf_fd;