Skip to content

Commit 7c4975c

Browse files
committed
Use new fswatcher to udpate android packages
1 parent c01b403 commit 7c4975c

File tree

6 files changed

+39
-35
lines changed

6 files changed

+39
-35
lines changed

go.mod

+3-2
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,20 @@ module github.com/sagernet/sing-tun
33
go 1.20
44

55
require (
6-
github.com/fsnotify/fsnotify v1.7.0
76
github.com/go-ole/go-ole v1.3.0
7+
github.com/sagernet/fswatch v0.1.1
88
github.com/sagernet/gvisor v0.0.0-20240428053021-e691de28565f
99
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a
1010
github.com/sagernet/nftables v0.3.0-beta.4
11-
github.com/sagernet/sing v0.5.0-alpha.10
11+
github.com/sagernet/sing v0.5.0-alpha.11.0.20240625144910-6bd878184516
1212
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba
1313
golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8
1414
golang.org/x/net v0.26.0
1515
golang.org/x/sys v0.21.0
1616
)
1717

1818
require (
19+
github.com/fsnotify/fsnotify v1.7.0 // indirect
1920
github.com/google/btree v1.1.2 // indirect
2021
github.com/google/go-cmp v0.6.0 // indirect
2122
github.com/josharian/native v1.1.0 // indirect

go.sum

+4-2
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,16 @@ github.com/mdlayher/netlink v1.7.2/go.mod h1:xraEF7uJbxLhc5fpHL4cPe221LI2bdttWlU
1414
github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U=
1515
github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA=
1616
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
17+
github.com/sagernet/fswatch v0.1.1 h1:YqID+93B7VRfqIH3PArW/XpJv5H4OLEVWDfProGoRQs=
18+
github.com/sagernet/fswatch v0.1.1/go.mod h1:nz85laH0mkQqJfaOrqPpkwtU1znMFNVTpT/5oRsVz/o=
1719
github.com/sagernet/gvisor v0.0.0-20240428053021-e691de28565f h1:NkhuupzH5ch7b/Y/6ZHJWrnNLoiNnSJaow6DPb8VW2I=
1820
github.com/sagernet/gvisor v0.0.0-20240428053021-e691de28565f/go.mod h1:KXmw+ouSJNOsuRpg4wgwwCQuunrGz4yoAqQjsLjc6N0=
1921
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a h1:ObwtHN2VpqE0ZNjr6sGeT00J8uU7JF4cNUdb44/Duis=
2022
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM=
2123
github.com/sagernet/nftables v0.3.0-beta.4 h1:kbULlAwAC3jvdGAC1P5Fa3GSxVwQJibNenDW2zaXr8I=
2224
github.com/sagernet/nftables v0.3.0-beta.4/go.mod h1:OQXAjvjNGGFxaTgVCSTRIhYB5/llyVDeapVoENYBDS8=
23-
github.com/sagernet/sing v0.5.0-alpha.10 h1:kuHl10gpjbKQAdQfyogQU3u0CVnpqC3wrAHe/+BFaXc=
24-
github.com/sagernet/sing v0.5.0-alpha.10/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
25+
github.com/sagernet/sing v0.5.0-alpha.11.0.20240625144910-6bd878184516 h1:C5NYqSEQC2CcILDFhT31iZe5Kp5hFNEtdS9mnNWyW5c=
26+
github.com/sagernet/sing v0.5.0-alpha.11.0.20240625144910-6bd878184516/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
2527
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
2628
github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1YX8=
2729
github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=

packages.go

+9-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package tun
22

3-
import E "github.com/sagernet/sing/common/exceptions"
3+
import "github.com/sagernet/sing/common/logger"
44

55
type PackageManager interface {
66
Start() error
@@ -11,7 +11,14 @@ type PackageManager interface {
1111
SharedPackageByID(id uint32) (string, bool)
1212
}
1313

14+
type PackageManagerOptions struct {
15+
Callback PackageManagerCallback
16+
17+
// Logger is the logger to log errors
18+
// optional
19+
Logger logger.Logger
20+
}
21+
1422
type PackageManagerCallback interface {
1523
OnPackagesUpdated(packages int, sharedUsers int)
16-
E.Handler
1724
}

packages_android.go

+21-27
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,33 @@ package tun
22

33
import (
44
"bytes"
5-
"context"
65
"encoding/xml"
76
"io"
87
"os"
98
"strconv"
109

10+
"github.com/sagernet/fswatch"
1111
"github.com/sagernet/sing/common"
1212
"github.com/sagernet/sing/common/abx"
1313
E "github.com/sagernet/sing/common/exceptions"
14-
15-
"github.com/fsnotify/fsnotify"
14+
"github.com/sagernet/sing/common/logger"
1615
)
1716

1817
type packageManager struct {
1918
callback PackageManagerCallback
20-
watcher *fsnotify.Watcher
19+
logger logger.Logger
20+
watcher *fswatch.Watcher
2121
idByPackage map[string]uint32
2222
sharedByPackage map[string]uint32
2323
packageById map[uint32]string
2424
sharedById map[uint32]string
2525
}
2626

27-
func NewPackageManager(callback PackageManagerCallback) (PackageManager, error) {
28-
return &packageManager{callback: callback}, nil
27+
func NewPackageManager(options PackageManagerOptions) (PackageManager, error) {
28+
return &packageManager{
29+
callback: options.Callback,
30+
logger: options.Logger,
31+
}, nil
2932
}
3033

3134
func (m *packageManager) Start() error {
@@ -35,42 +38,33 @@ func (m *packageManager) Start() error {
3538
}
3639
err = m.startWatcher()
3740
if err != nil {
38-
m.callback.NewError(context.Background(), E.Cause(err, "create fsnotify watcher"))
41+
m.logger.Error(E.Cause(err, "create watcher for packages list"))
3942
}
4043
return nil
4144
}
4245

4346
func (m *packageManager) startWatcher() error {
44-
watcher, err := fsnotify.NewWatcher()
47+
watcher, err := fswatch.NewWatcher(fswatch.Options{
48+
Path: []string{"/data/system/packages.xml"},
49+
Direct: true,
50+
Callback: m.packagesUpdated,
51+
Logger: m.logger,
52+
})
4553
if err != nil {
4654
return err
4755
}
48-
err = watcher.Add("/data/system/packages.xml")
56+
err = watcher.Start()
4957
if err != nil {
5058
return err
5159
}
5260
m.watcher = watcher
53-
go m.loopUpdate()
5461
return nil
5562
}
5663

57-
func (m *packageManager) loopUpdate() {
58-
for {
59-
select {
60-
case _, ok := <-m.watcher.Events:
61-
if !ok {
62-
return
63-
}
64-
err := m.updatePackages()
65-
if err != nil {
66-
m.callback.NewError(context.Background(), E.Cause(err, "update packages"))
67-
}
68-
case err, ok := <-m.watcher.Errors:
69-
if !ok {
70-
return
71-
}
72-
m.callback.NewError(context.Background(), E.Cause(err, "fsnotify error"))
73-
}
64+
func (m *packageManager) packagesUpdated(path string) {
65+
err := m.updatePackages()
66+
if err != nil {
67+
m.logger.Error(E.Cause(err, "update packages"))
7468
}
7569
}
7670

packages_stub.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ package tun
44

55
import "os"
66

7-
func NewPackageManager(callback PackageManagerCallback) (PackageManager, error) {
7+
func NewPackageManager(options PackageManagerOptions) (PackageManager, error) {
88
return nil, os.ErrInvalid
99
}

tun_linux.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ var controlPath string
182182
func init() {
183183
const defaultTunPath = "/dev/net/tun"
184184
const androidTunPath = "/dev/tun"
185-
if rw.FileExists(androidTunPath) {
185+
if rw.IsFile(androidTunPath) {
186186
controlPath = androidTunPath
187187
} else {
188188
controlPath = defaultTunPath

0 commit comments

Comments
 (0)