From cdd7ee4ee7acb4094c816a47f2faef7d6225cf28 Mon Sep 17 00:00:00 2001 From: gsd Date: Sun, 29 Mar 2026 20:09:44 +0300 Subject: [PATCH] iSh support 386 linux --- .gitignore | 1 + client/main.go | 116 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4be6e16 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +dist/* \ No newline at end of file diff --git a/client/main.go b/client/main.go index 776b1a6..4c0f0e2 100644 --- a/client/main.go +++ b/client/main.go @@ -17,6 +17,7 @@ import ( "github.com/pion/dtls/v3" "github.com/pion/dtls/v3/pkg/crypto/selfsign" "github.com/pion/logging" + "github.com/pion/transport/v4" "github.com/pion/turn/v5" "io" "log" @@ -33,6 +34,120 @@ import ( type getCredsFunc func(string) (string, string, string, error) +func closeWithLog(closer io.Closer, msg string) { + if err := closer.Close(); err != nil { + log.Printf("%s: %v", msg, err) + } +} + +func setDeadlineWithLog(conn interface{ SetDeadline(time.Time) error }, t time.Time, msg string) { + if err := conn.SetDeadline(t); err != nil { + log.Printf("%s: %v", msg, err) + } +} + +func setReadDeadlineWithLog(conn interface{ SetReadDeadline(time.Time) error }, t time.Time, msg string) { + if err := conn.SetReadDeadline(t); err != nil { + log.Printf("%s: %v", msg, err) + } +} + +// directNet implements pion/transport.Net without enumerating system interfaces. +// iSH on iPhone often fails on net.Interfaces()/netlink, but TURN client setup +// only needs dial/listen/resolve operations. +type directNet struct{} + +func (directNet) ListenPacket(network string, address string) (net.PacketConn, error) { + return net.ListenPacket(network, address) //nolint:noctx +} + +func (directNet) ListenUDP(network string, locAddr *net.UDPAddr) (transport.UDPConn, error) { + return net.ListenUDP(network, locAddr) +} + +func (directNet) ListenTCP(network string, laddr *net.TCPAddr) (transport.TCPListener, error) { + l, err := net.ListenTCP(network, laddr) + if err != nil { + return nil, err + } + + return tcpListener{TCPListener: l}, nil +} + +func (directNet) Dial(network, address string) (net.Conn, error) { + return net.Dial(network, address) //nolint:noctx +} + +func (directNet) DialUDP(network string, laddr, raddr *net.UDPAddr) (transport.UDPConn, error) { + return net.DialUDP(network, laddr, raddr) +} + +func (directNet) DialTCP(network string, laddr, raddr *net.TCPAddr) (transport.TCPConn, error) { + return net.DialTCP(network, laddr, raddr) +} + +func (directNet) ResolveIPAddr(network, address string) (*net.IPAddr, error) { + return net.ResolveIPAddr(network, address) +} + +func (directNet) ResolveUDPAddr(network, address string) (*net.UDPAddr, error) { + return net.ResolveUDPAddr(network, address) +} + +func (directNet) ResolveTCPAddr(network, address string) (*net.TCPAddr, error) { + return net.ResolveTCPAddr(network, address) +} + +func (directNet) Interfaces() ([]*transport.Interface, error) { + return nil, nil +} + +func (directNet) InterfaceByIndex(index int) (*transport.Interface, error) { + return nil, fmt.Errorf("%w: index=%d", transport.ErrInterfaceNotFound, index) +} + +func (directNet) InterfaceByName(name string) (*transport.Interface, error) { + return nil, fmt.Errorf("%w: %s", transport.ErrInterfaceNotFound, name) +} + +func (directNet) CreateDialer(d *net.Dialer) transport.Dialer { + return stdDialer{Dialer: d} +} + +func (directNet) CreateListenConfig(lc *net.ListenConfig) transport.ListenConfig { + return stdListenConfig{ListenConfig: lc} +} + +type stdDialer struct { + *net.Dialer +} + +func (d stdDialer) Dial(network, address string) (net.Conn, error) { + return d.Dialer.Dial(network, address) +} + +type stdListenConfig struct { + *net.ListenConfig +} + +func (lc stdListenConfig) Listen(ctx context.Context, network, address string) (net.Listener, error) { + return lc.ListenConfig.Listen(ctx, network, address) +} + +func (lc stdListenConfig) ListenPacket(ctx context.Context, network, address string) (net.PacketConn, error) { + return lc.ListenConfig.ListenPacket(ctx, network, address) +} + +type tcpListener struct { + *net.TCPListener +} + +func (l tcpListener) AcceptTCP() (transport.TCPConn, error) { + return l.TCPListener.AcceptTCP() +} + + + func getVkCreds(link string, dialer *dnsdialer.Dialer) (string, string, string, error) { doRequest := func(data string, url string) (resp map[string]interface{}, err error) { @@ -655,6 +770,7 @@ func oneTurnConnection(ctx context.Context, turnParams *turnParams, peer *net.UD STUNServerAddr: turnServerAddr, TURNServerAddr: turnServerAddr, Conn: turnConn, + Net: directNet{}, Username: user, Password: pass, RequestedAddressFamily: addrFamily,