aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/netlink
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2026-03-30 23:18:43 +0900
committerOphestra <cat@gensokyo.uk>2026-03-30 23:18:43 +0900
commita854719b9f11fea48e7221eeff50d4cdb3801052 (patch)
tree953e4369fcf4582a0744ca036a065400dad3362b /internal/netlink
parentf03c0fb249ea8787ae8ec086970eb089109ebf6f (diff)
internal/netlink: optional recvmsg without netpoll
For draining the socket receive buffer. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/netlink')
-rw-r--r--internal/netlink/netlink.go17
1 files changed, 17 insertions, 0 deletions
diff --git a/internal/netlink/netlink.go b/internal/netlink/netlink.go
index 6cd15610..2b7e8704 100644
--- a/internal/netlink/netlink.go
+++ b/internal/netlink/netlink.go
@@ -135,6 +135,23 @@ func (c *Conn) Recvmsg(
var n int
data = c.buf[:]
+
+ if ctx == nil {
+ rcErr := c.raw.Control(func(fd uintptr) {
+ n, _, recvflags, from, err = syscall.Recvmsg(int(fd), data, nil, flags)
+ })
+ if n >= 0 {
+ data = data[:n]
+ }
+
+ if err != nil {
+ err = os.NewSyscallError("recvmsg", err)
+ } else {
+ err = rcErr
+ }
+ return
+ }
+
done := make(chan error, 1)
go func() {
rcErr := c.raw.Read(func(fd uintptr) (done bool) {