internal/netlink: isolate receive method
All checks were successful
Test / Create distribution (push) Successful in 1m3s
Test / Sandbox (push) Successful in 2m59s
Test / ShareFS (push) Successful in 4m49s
Test / Hakurei (push) Successful in 5m36s
Test / Sandbox (race detector) (push) Successful in 5m33s
Test / Hakurei (race detector) (push) Successful in 8m6s
Test / Flake checks (push) Successful in 1m23s

This enables use with epoll for receiving events only.

Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
2026-03-23 15:03:15 +09:00
parent f7bfa9a6c2
commit d8648304bb

View File

@@ -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