Skip to content

Commit f0b6818

Browse files
committed
Add workaround for golang/go#68760
1 parent 3032317 commit f0b6818

File tree

7 files changed

+78
-15
lines changed

7 files changed

+78
-15
lines changed

Makefile

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,9 +201,15 @@ test_stdio:
201201
lib_android:
202202
go run ./cmd/internal/build_libbox -target android
203203

204+
lib_android_debug:
205+
go run ./cmd/internal/build_libbox -target android -debug
206+
204207
lib_ios:
205208
go run ./cmd/internal/build_libbox -target ios
206209

210+
lib_ios_debug:
211+
go run ./cmd/internal/build_libbox -target ios -debug
212+
207213
lib:
208214
go run ./cmd/internal/build_libbox -target android
209215
go run ./cmd/internal/build_libbox -target ios

cmd/internal/build_libbox/main.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,17 @@ func buildAndroid() {
8080
log.Fatal("java version should be openjdk 17")
8181
}
8282

83+
var bindTarget string
84+
if debugEnabled {
85+
bindTarget = "android/arm64"
86+
} else {
87+
bindTarget = "android"
88+
}
89+
8390
args := []string{
8491
"bind",
8592
"-v",
93+
"-target", bindTarget,
8694
"-androidapi", "21",
8795
"-javapkg=io.nekohasekai",
8896
"-libname=box",

constant/cgo_android_fix.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
//go:build android && debug
2+
3+
package constant
4+
5+
// TODO: remove after fixed
6+
// https://github.com/golang/go/issues/68760
7+
8+
const FixAndroidStack = true

constant/cgo_android_fix_stub.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
//go:build !(android && debug)
2+
3+
package constant
4+
5+
const FixAndroidStack = false

experimental/libbox/command_client.go

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"path/filepath"
88
"time"
99

10+
C "github.com/sagernet/sing-box/constant"
1011
"github.com/sagernet/sing/common"
1112
E "github.com/sagernet/sing/common/exceptions"
1213
)
@@ -113,11 +114,24 @@ func (c *CommandClient) Connect() error {
113114
if err != nil {
114115
return err
115116
}
116-
c.handler.Connected()
117-
c.handler.InitializeClashMode(newIterator(modeList), currentMode)
117+
if C.FixAndroidStack {
118+
go func() {
119+
c.handler.Connected()
120+
c.handler.InitializeClashMode(newIterator(modeList), currentMode)
121+
if len(modeList) == 0 {
122+
conn.Close()
123+
c.handler.Disconnected(os.ErrInvalid.Error())
124+
}
125+
}()
126+
} else {
127+
c.handler.Connected()
128+
c.handler.InitializeClashMode(newIterator(modeList), currentMode)
129+
if len(modeList) == 0 {
130+
conn.Close()
131+
c.handler.Disconnected(os.ErrInvalid.Error())
132+
}
133+
}
118134
if len(modeList) == 0 {
119-
conn.Close()
120-
c.handler.Disconnected(os.ErrInvalid.Error())
121135
return nil
122136
}
123137
go c.handleModeConn(conn)

experimental/libbox/monitor.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"net/netip"
66
"sync"
77

8+
C "github.com/sagernet/sing-box/constant"
89
"github.com/sagernet/sing-tun"
910
"github.com/sagernet/sing/common"
1011
E "github.com/sagernet/sing/common/exceptions"
@@ -97,6 +98,14 @@ func (m *platformDefaultInterfaceMonitor) UnregisterCallback(element *list.Eleme
9798
}
9899

99100
func (m *platformDefaultInterfaceMonitor) UpdateDefaultInterface(interfaceName string, interfaceIndex32 int32) {
101+
if C.FixAndroidStack {
102+
go m.updateDefaultInterface(interfaceName, interfaceIndex32)
103+
} else {
104+
m.updateDefaultInterface(interfaceName, interfaceIndex32)
105+
}
106+
}
107+
108+
func (m *platformDefaultInterfaceMonitor) updateDefaultInterface(interfaceName string, interfaceIndex32 int32) {
100109
if interfaceName == "" || interfaceIndex32 == -1 {
101110
m.defaultInterfaceName = ""
102111
m.defaultInterfaceIndex = -1

experimental/libbox/service.go

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -73,23 +73,36 @@ func NewService(configContent string, platformInterface PlatformInterface) (*Box
7373
}
7474

7575
func (s *BoxService) Start() error {
76-
return s.instance.Start()
76+
if C.FixAndroidStack {
77+
var err error
78+
done := make(chan struct{})
79+
go func() {
80+
err = s.instance.Start()
81+
close(done)
82+
}()
83+
<-done
84+
return err
85+
} else {
86+
return s.instance.Start()
87+
}
7788
}
7889

7990
func (s *BoxService) Close() error {
91+
s.cancel()
92+
s.urlTestHistoryStorage.Close()
93+
var err error
8094
done := make(chan struct{})
81-
defer close(done)
8295
go func() {
83-
select {
84-
case <-done:
85-
return
86-
case <-time.After(C.FatalStopTimeout):
87-
os.Exit(1)
88-
}
96+
err = s.instance.Close()
97+
close(done)
8998
}()
90-
s.cancel()
91-
s.urlTestHistoryStorage.Close()
92-
return s.instance.Close()
99+
select {
100+
case <-done:
101+
return err
102+
case <-time.After(C.FatalStopTimeout):
103+
os.Exit(1)
104+
return nil
105+
}
93106
}
94107

95108
func (s *BoxService) NeedWIFIState() bool {

0 commit comments

Comments
 (0)