diff options
| author | Ophestra <cat@gensokyo.uk> | 2026-03-23 15:03:15 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2026-03-23 15:03:15 +0900 |
| commit | d8648304bb4208593be0c48b8b1b26c1caa8b3ea (patch) | |
| tree | 1c7291aee6ce24a9aaa43a983e8c9ab923ebb943 /internal | |
| parent | f7bfa9a6c27b3f36e66548d7bdcb5b8d9cae6747 (diff) | |
internal/netlink: isolate receive method
This enables use with epoll for receiving events only.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/netlink/netlink.go | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/internal/netlink/netlink.go b/internal/netlink/netlink.go index d1260c84..e6f6fa26 100644 --- a/internal/netlink/netlink.go +++ b/internal/netlink/netlink.go @@ -156,9 +156,18 @@ func (c *conn) Roundtrip(f func(msg *syscall.NetlinkMessage) error) error { return os.NewSyscallError("sendto", err) } + return c.receive(f, 0) +} + +// receive receives from a socket with specified flags until a non-nil error is +// returned by f. An error of type [Complete] is returned as nil. +func (c *conn) receive( + f func(msg *syscall.NetlinkMessage) error, + flags int, +) error { for { buf := c.buf - if n, _, err := syscall.Recvfrom(c.fd, buf, 0); err != nil { + if n, _, err := syscall.Recvfrom(c.fd, buf, flags); err != nil { return os.NewSyscallError("recvfrom", err) } else if n < syscall.NLMSG_HDRLEN { return syscall.EBADE |
