diff --git a/common/redir/redir_linux.go b/common/redir/redir_linux.go index abb1b1a7..0f58b2da 100644 --- a/common/redir/redir_linux.go +++ b/common/redir/redir_linux.go @@ -3,35 +3,35 @@ package redir import ( "net" "net/netip" + "os" "syscall" + "github.com/sagernet/sing/common" + "github.com/sagernet/sing/common/control" M "github.com/sagernet/sing/common/metadata" ) func GetOriginalDestination(conn net.Conn) (destination netip.AddrPort, err error) { - rawConn, err := conn.(syscall.Conn).SyscallConn() - if err != nil { - return + syscallConn, ok := common.Cast[syscall.Conn](conn) + if !ok { + return netip.AddrPort{}, os.ErrInvalid } - var rawFd uintptr - err = rawConn.Control(func(fd uintptr) { - rawFd = fd + err = control.Conn(syscallConn, func(fd uintptr) error { + const SO_ORIGINAL_DST = 80 + if conn.RemoteAddr().(*net.TCPAddr).IP.To4() != nil { + raw, err := syscall.GetsockoptIPv6Mreq(int(fd), syscall.IPPROTO_IP, SO_ORIGINAL_DST) + if err != nil { + return err + } + destination = netip.AddrPortFrom(M.AddrFromIP(raw.Multiaddr[4:8]), uint16(raw.Multiaddr[2])<<8+uint16(raw.Multiaddr[3])) + } else { + raw, err := syscall.GetsockoptIPv6MTUInfo(int(fd), syscall.IPPROTO_IPV6, SO_ORIGINAL_DST) + if err != nil { + return err + } + destination = netip.AddrPortFrom(M.AddrFromIP(raw.Addr.Addr[:]), raw.Addr.Port) + } + return nil }) - if err != nil { - return - } - const SO_ORIGINAL_DST = 80 - if conn.RemoteAddr().(*net.TCPAddr).IP.To4() != nil { - raw, err := syscall.GetsockoptIPv6Mreq(int(rawFd), syscall.IPPROTO_IP, SO_ORIGINAL_DST) - if err != nil { - return netip.AddrPort{}, err - } - return netip.AddrPortFrom(M.AddrFromIP(raw.Multiaddr[4:8]), uint16(raw.Multiaddr[2])<<8+uint16(raw.Multiaddr[3])), nil - } else { - raw, err := syscall.GetsockoptIPv6MTUInfo(int(rawFd), syscall.IPPROTO_IPV6, SO_ORIGINAL_DST) - if err != nil { - return netip.AddrPort{}, err - } - return netip.AddrPortFrom(M.AddrFromIP(raw.Addr.Addr[:]), raw.Addr.Port), nil - } + return } diff --git a/common/settings/command.go b/common/settings/command.go deleted file mode 100644 index 0ba88ddb..00000000 --- a/common/settings/command.go +++ /dev/null @@ -1,21 +0,0 @@ -package settings - -import ( - "os" - "os/exec" -) - -func runCommand(name string, args ...string) error { - command := exec.Command(name, args...) - command.Env = os.Environ() - command.Stdin = os.Stdin - command.Stdout = os.Stderr - command.Stderr = os.Stderr - return command.Run() -} - -func readCommand(name string, args ...string) ([]byte, error) { - command := exec.Command(name, args...) - command.Env = os.Environ() - return command.CombinedOutput() -} diff --git a/common/settings/proxy_darwin.go b/common/settings/proxy_darwin.go index 4b27e053..22d3b7c5 100644 --- a/common/settings/proxy_darwin.go +++ b/common/settings/proxy_darwin.go @@ -5,6 +5,7 @@ import ( "github.com/sagernet/sing-box/adapter" "github.com/sagernet/sing-tun" + "github.com/sagernet/sing/common" E "github.com/sagernet/sing/common/exceptions" F "github.com/sagernet/sing/common/format" "github.com/sagernet/sing/common/x/list" @@ -32,13 +33,13 @@ func (p *systemProxy) update() error { return err } if p.isMixed { - err = runCommand("networksetup", "-setsocksfirewallproxy", interfaceDisplayName, "127.0.0.1", F.ToString(p.port)) + err = common.Exec("networksetup", "-setsocksfirewallproxy", interfaceDisplayName, "127.0.0.1", F.ToString(p.port)).Attach().Run() } if err == nil { - err = runCommand("networksetup", "-setwebproxy", interfaceDisplayName, "127.0.0.1", F.ToString(p.port)) + err = common.Exec("networksetup", "-setwebproxy", interfaceDisplayName, "127.0.0.1", F.ToString(p.port)).Attach().Run() } if err == nil { - err = runCommand("networksetup", "-setsecurewebproxy", interfaceDisplayName, "127.0.0.1", F.ToString(p.port)) + err = common.Exec("networksetup", "-setsecurewebproxy", interfaceDisplayName, "127.0.0.1", F.ToString(p.port)).Attach().Run() } return err } @@ -49,19 +50,19 @@ func (p *systemProxy) unset() error { return err } if p.isMixed { - err = runCommand("networksetup", "-setsocksfirewallproxystate", interfaceDisplayName, "off") + err = common.Exec("networksetup", "-setsocksfirewallproxystate", interfaceDisplayName, "off").Attach().Run() } if err == nil { - err = runCommand("networksetup", "-setwebproxystate", interfaceDisplayName, "off") + err = common.Exec("networksetup", "-setwebproxystate", interfaceDisplayName, "off").Attach().Run() } if err == nil { - err = runCommand("networksetup", "-setsecurewebproxystate", interfaceDisplayName, "off") + err = common.Exec("networksetup", "-setsecurewebproxystate", interfaceDisplayName, "off").Attach().Run() } return err } func getInterfaceDisplayName(name string) (string, error) { - content, err := readCommand("networksetup", "-listallhardwareports") + content, err := common.Exec("networksetup", "-listallhardwareports").Read() if err != nil { return "", err } diff --git a/common/settings/proxy_linux.go b/common/settings/proxy_linux.go index decfe443..f91f5829 100644 --- a/common/settings/proxy_linux.go +++ b/common/settings/proxy_linux.go @@ -27,9 +27,9 @@ func init() { func runAsUser(name string, args ...string) error { if os.Getuid() != 0 { - return runCommand(name, args...) + return common.Exec(name, args...).Attach().Run() } else if sudoUser != "" { - return runCommand("su", "-", sudoUser, "-c", F.ToString(name, " ", strings.Join(args, " "))) + return common.Exec("su", "-", sudoUser, "-c", F.ToString(name, " ", strings.Join(args, " "))).Attach().Run() } else { return E.New("set system proxy: unable to set as root") } diff --git a/go.mod b/go.mod index 77a370a4..6315a2cc 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/logrusorgru/aurora v2.0.3+incompatible github.com/lucas-clemente/quic-go v0.28.1 github.com/oschwald/maxminddb-golang v1.10.0 - github.com/sagernet/sing v0.0.0-20220815085149-6b313ff9efc3 + github.com/sagernet/sing v0.0.0-20220816094748-fb82be7f3f08 github.com/sagernet/sing-dns v0.0.0-20220813025814-e656c9dbf3ae github.com/sagernet/sing-shadowsocks v0.0.0-20220812082714-484a11603b48 github.com/sagernet/sing-tun v0.0.0-20220815033412-1407eae46bd7 diff --git a/go.sum b/go.sum index b12e62bc..8f0b16dd 100644 --- a/go.sum +++ b/go.sum @@ -153,8 +153,10 @@ github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/sagernet/netlink v0.0.0-20220803045538-bdac49abf805 h1:hE+vtsjBCCPmxkRz9jZA+CicHgVkDT6H+Av5ZzskVxs= github.com/sagernet/netlink v0.0.0-20220803045538-bdac49abf805/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM= github.com/sagernet/sing v0.0.0-20220812082120-05f9836bff8f/go.mod h1:QVsS5L/ZA2Q5UhQwLrn0Trw+msNd/NPGEhBKR/ioWiY= -github.com/sagernet/sing v0.0.0-20220815085149-6b313ff9efc3 h1:f9QdygPxD5wuAOnO6NpWF/Ra5bT6NPUOL3oQNulWSo8= -github.com/sagernet/sing v0.0.0-20220815085149-6b313ff9efc3/go.mod h1:QVsS5L/ZA2Q5UhQwLrn0Trw+msNd/NPGEhBKR/ioWiY= +github.com/sagernet/sing v0.0.0-20220816094310-1b9cf9a6266f h1:fNgFTFkBLi0oJZUZFLs2LbiITblUgxWgZNGoRU/SIXE= +github.com/sagernet/sing v0.0.0-20220816094310-1b9cf9a6266f/go.mod h1:QVsS5L/ZA2Q5UhQwLrn0Trw+msNd/NPGEhBKR/ioWiY= +github.com/sagernet/sing v0.0.0-20220816094748-fb82be7f3f08 h1:Z5UMSxFO+c2GtJqDlU7SF4OqzEV76KNYktTyzhofL9o= +github.com/sagernet/sing v0.0.0-20220816094748-fb82be7f3f08/go.mod h1:QVsS5L/ZA2Q5UhQwLrn0Trw+msNd/NPGEhBKR/ioWiY= github.com/sagernet/sing-dns v0.0.0-20220813025814-e656c9dbf3ae h1:xOpbvgizvIbKKrrcl/CK3RjGY2u7rC+SBXlgqzEZOU4= github.com/sagernet/sing-dns v0.0.0-20220813025814-e656c9dbf3ae/go.mod h1:T77zZdE2Cm6VqnFumrpwsq+kxYsbq+vWDhmjtdSl/oM= github.com/sagernet/sing-shadowsocks v0.0.0-20220812082714-484a11603b48 h1:NlcTFKldteZvYBDyr+V9MjZEI0rAWCSFCyLgPvc5n/Y=