searcher_android.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package process
  2. import (
  3. "context"
  4. "net/netip"
  5. "github.com/sagernet/sing-box/adapter"
  6. "github.com/sagernet/sing-tun"
  7. "github.com/sagernet/sing/common"
  8. )
  9. var _ Searcher = (*androidSearcher)(nil)
  10. type androidSearcher struct {
  11. packageManager tun.PackageManager
  12. }
  13. func NewSearcher(config Config) (Searcher, error) {
  14. return &androidSearcher{config.PackageManager}, nil
  15. }
  16. func (s *androidSearcher) Close() error {
  17. return nil
  18. }
  19. func (s *androidSearcher) FindProcessInfo(ctx context.Context, network string, source netip.AddrPort, destination netip.AddrPort) (*adapter.ConnectionOwner, error) {
  20. family, protocol, err := socketDiagSettings(network, source)
  21. if err != nil {
  22. return nil, err
  23. }
  24. _, uid, err := querySocketDiagOnce(family, protocol, source)
  25. if err != nil {
  26. return nil, err
  27. }
  28. appID := uid % 100000
  29. var packageNames []string
  30. if sharedPackage, loaded := s.packageManager.SharedPackageByID(appID); loaded {
  31. packageNames = append(packageNames, sharedPackage)
  32. }
  33. if packages, loaded := s.packageManager.PackagesByID(appID); loaded {
  34. packageNames = append(packageNames, packages...)
  35. }
  36. packageNames = common.Uniq(packageNames)
  37. return &adapter.ConnectionOwner{
  38. UserId: int32(uid),
  39. AndroidPackageNames: packageNames,
  40. }, nil
  41. }