Move more syscall function into their own impl.

Windows is stupid
This commit is contained in:
Miek Gieben 2014-07-11 08:47:49 +00:00
parent 907e91be57
commit e571f699d2
3 changed files with 28 additions and 14 deletions

6
udp.go
View File

@ -19,15 +19,13 @@ func (s *sessionUDP) RemoteAddr() net.Addr { return s.raddr }
// setUDPSocketOptions sets the UDP socket options.
// This function is implemented on a per platform basis. See udp_*.go for more details
func setUDPSocketOptions(conn *net.UDPConn) error {
file, err := conn.File()
sa, err := getUDPSocketName(conn)
if err != nil {
return err
}
sa, err := syscall.Getsockname(int(file.Fd()))
switch sa.(type) {
case *syscall.SockaddrInet6:
v6only, err := getUDPSocketOption6Only(conn)
v6only, err := getUDPSocketOptions6Only(conn)
if err != nil {
return err
}

View File

@ -21,8 +21,10 @@ import (
// setUDPSocketOptions4 prepares the v4 socket for sessions.
func setUDPSocketOptions4(conn *net.UDPConn) error {
// We got the .File() in NewUDPConn, this this will work.
file, _ := conn.File()
file, err := conn.File()
if err != nil {
return err
}
if err := syscall.SetsockoptInt(int(file.Fd()), syscall.IPPROTO_IP, syscall.IP_PKTINFO, 1); err != nil {
return err
}
@ -31,8 +33,10 @@ func setUDPSocketOptions4(conn *net.UDPConn) error {
// setUDPSocketOptions6 prepares the v6 socket for sessions.
func setUDPSocketOptions6(conn *net.UDPConn) error {
// We got the .File() in NewUDPConn, this this will work.
file, _ := conn.File()
file, err := conn.File()
if err != nil {
return err
}
if err := syscall.SetsockoptInt(int(file.Fd()), syscall.IPPROTO_IPV6, syscall.IPV6_RECVPKTINFO, 1); err != nil {
return err
}
@ -41,9 +45,11 @@ func setUDPSocketOptions6(conn *net.UDPConn) error {
// getUDPSocketOption6Only return true if the socket is v6 only and false when it is v4/v6 combined
// (dualstack).
func getUDPSocketOption6Only(conn *net.UDPConn) (bool, error) {
// We got the .File() in NewUDPConn, this this will work.
file, _ := conn.File()
func getUDPSocketOptions6Only(conn *net.UDPConn) (bool, error) {
file, err := conn.File()
if err != nil {
return false, err
}
// dual stack. See http://stackoverflow.com/questions/1618240/how-to-support-both-ipv4-and-ipv6-connections
v6only, err := syscall.GetsockoptInt(int(file.Fd()), syscall.IPPROTO_IPV6, syscall.IPV6_V6ONLY)
if err != nil {
@ -51,3 +57,11 @@ func getUDPSocketOption6Only(conn *net.UDPConn) (bool, error) {
}
return v6only == 1, nil
}
func getUDPSocketName(conn *net.UDPConn) (syscall.Sockaddr, error) {
file, err := conn.File()
if err != nil {
return nil, err
}
return syscall.Getsockname(int(file.Fd()))
}

View File

@ -12,7 +12,9 @@ import (
// These do nothing. See udp_linux.go for an example of how to implement this.
func setUDPSocketOptions4(conn *net.UDPConn) error { return nil }
func setUDPSocketOptions6(conn *net.UDPConn) error { return nil }
// We tried to adhire to some kind of naming scheme.
func getUDPSocketOption6Only(conn *net.UDPConn) (bool, error) { return false, nil }
func setUDPSocketOptions4(conn *net.UDPConn) error { return nil }
func setUDPSocketOptions6(conn *net.UDPConn) error { return nil }
func getUDPSocketOptions6Only(conn *net.UDPConn) (bool, error) { return false, nil }
func getUDPSocketName(conn *net.UDPConn) (syscal.Sockaddr, error) { return nil, nil }