Fix: control should return error

This commit is contained in:
xjasonlyu
2021-11-27 13:27:44 +08:00
parent 6bb44f9eb1
commit cf557f0eb1
3 changed files with 34 additions and 16 deletions

View File

@@ -8,19 +8,25 @@ import (
) )
func bindToInterface(i *net.Interface) controlFunc { func bindToInterface(i *net.Interface) controlFunc {
return func(network, address string, c syscall.RawConn) error { return func(network, address string, c syscall.RawConn) (err error) {
ipStr, _, _ := net.SplitHostPort(address) host, _, _ := net.SplitHostPort(address)
if ip := net.ParseIP(ipStr); ip != nil && !ip.IsGlobalUnicast() { if ip := net.ParseIP(host); ip != nil && !ip.IsGlobalUnicast() {
return nil return
} }
return c.Control(func(fd uintptr) { var innerErr error
err = c.Control(func(fd uintptr) {
switch network { switch network {
case "tcp4", "udp4": case "tcp4", "udp4":
unix.SetsockoptInt(int(fd), syscall.IPPROTO_IP, syscall.IP_BOUND_IF, i.Index) innerErr = unix.SetsockoptInt(int(fd), syscall.IPPROTO_IP, syscall.IP_BOUND_IF, i.Index)
case "tcp6", "udp6": case "tcp6", "udp6":
unix.SetsockoptInt(int(fd), syscall.IPPROTO_IPV6, syscall.IPV6_BOUND_IF, i.Index) innerErr = unix.SetsockoptInt(int(fd), syscall.IPPROTO_IPV6, syscall.IPV6_BOUND_IF, i.Index)
} }
}) })
if innerErr != nil {
err = innerErr
}
return
} }
} }

View File

@@ -8,14 +8,20 @@ import (
) )
func bindToInterface(i *net.Interface) controlFunc { func bindToInterface(i *net.Interface) controlFunc {
return func(network, address string, c syscall.RawConn) error { return func(network, address string, c syscall.RawConn) (err error) {
ipStr, _, _ := net.SplitHostPort(address) host, _, _ := net.SplitHostPort(address)
if ip := net.ParseIP(ipStr); ip != nil && !ip.IsGlobalUnicast() { if ip := net.ParseIP(host); ip != nil && !ip.IsGlobalUnicast() {
return nil return nil
} }
return c.Control(func(fd uintptr) { var innerErr error
unix.BindToDevice(int(fd), i.Name) err = c.Control(func(fd uintptr) {
innerErr = unix.BindToDevice(int(fd), i.Name)
}) })
if innerErr != nil {
err = innerErr
}
return
} }
} }

View File

@@ -6,10 +6,16 @@ import (
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
) )
func setMark(i int) controlFunc { func setMark(m int) controlFunc {
return func(_, _ string, c syscall.RawConn) error { return func(_, _ string, c syscall.RawConn) (err error) {
return c.Control(func(fd uintptr) { var innerErr error
unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_MARK, i) err = c.Control(func(fd uintptr) {
innerErr = unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_MARK, m)
}) })
if innerErr != nil {
err = innerErr
}
return
} }
} }