searcher_android.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. package process
  2. import (
  3. "context"
  4. "net/netip"
  5. "github.com/sagernet/sing-box/adapter"
  6. "github.com/sagernet/sing-tun"
  7. )
  8. var _ Searcher = (*androidSearcher)(nil)
  9. type androidSearcher struct {
  10. packageManager tun.PackageManager
  11. }
  12. func NewSearcher(config Config) (Searcher, error) {
  13. return &androidSearcher{config.PackageManager}, nil
  14. }
  15. func (s *androidSearcher) FindProcessInfo(ctx context.Context, network string, source netip.AddrPort, destination netip.AddrPort) (*adapter.ConnectionOwner, error) {
  16. _, uid, err := resolveSocketByNetlink(network, source, destination)
  17. if err != nil {
  18. return nil, err
  19. }
  20. if sharedPackage, loaded := s.packageManager.SharedPackageByID(uid % 100000); loaded {
  21. return &adapter.ConnectionOwner{
  22. UserId: int32(uid),
  23. AndroidPackageName: sharedPackage,
  24. }, nil
  25. }
  26. if packageName, loaded := s.packageManager.PackageByID(uid % 100000); loaded {
  27. return &adapter.ConnectionOwner{
  28. UserId: int32(uid),
  29. AndroidPackageName: packageName,
  30. }, nil
  31. }
  32. return &adapter.ConnectionOwner{UserId: int32(uid)}, nil
  33. }