restore Windows compatibility (#860) (#861)

This commit is contained in:
Alessandro Ros
2025-08-12 12:45:06 +02:00
committed by GitHub
parent 78a8f619f7
commit cf1e074137
8 changed files with 113 additions and 38 deletions

View File

@@ -0,0 +1,13 @@
// Package readbuffer contains a function to get the read buffer size of a socket.
package readbuffer
import (
"net"
"syscall"
)
// PacketConn is a packet connection.
type PacketConn interface {
net.PacketConn
SyscallConn() (syscall.RawConn, error)
}

View File

@@ -0,0 +1,31 @@
//go:build linux
package readbuffer
import (
"syscall"
)
// ReadBuffer returns the read buffer size.
func ReadBuffer(pc PacketConn) (int, error) {
rawConn, err := pc.SyscallConn()
if err != nil {
panic(err)
}
var v int
var err2 error
err = rawConn.Control(func(fd uintptr) {
v, err2 = syscall.GetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_RCVBUF)
})
if err != nil {
return 0, err
}
if err2 != nil {
return 0, err2
}
return v / 2, nil
}

View File

@@ -0,0 +1,10 @@
//go:build !linux && !windows
package readbuffer
import "fmt"
// ReadBuffer returns the read buffer size.
func ReadBuffer(pc PacketConn) (int, error) {
return 0, fmt.Errorf("read buffer size is unimplemented on the current operating system")
}

View File

@@ -0,0 +1,29 @@
//go:build windows
package readbuffer
import "syscall"
// ReadBuffer returns the read buffer size.
func ReadBuffer(pc PacketConn) (int, error) {
rawConn, err := pc.SyscallConn()
if err != nil {
panic(err)
}
var v int
var err2 error
err = rawConn.Control(func(fd uintptr) {
v, err2 = syscall.GetsockoptInt(syscall.Handle(fd), syscall.SOL_SOCKET, syscall.SO_RCVBUF)
})
if err != nil {
return 0, err
}
if err2 != nil {
return 0, err2
}
return v, nil
}