patch_android.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. //go:build android
  2. package dns
  3. import (
  4. "context"
  5. D "github.com/miekg/dns"
  6. "github.com/metacubex/mihomo/common/lru"
  7. "github.com/metacubex/mihomo/component/dhcp"
  8. "github.com/metacubex/mihomo/component/resolver"
  9. )
  10. const SystemDNSPlaceholder = "system"
  11. var systemResolver *Resolver
  12. var isolateHandler handler
  13. var _ dnsClient = (*dhcpClient)(nil)
  14. type dhcpClient struct {
  15. enable bool
  16. }
  17. func (d *dhcpClient) Address() string {
  18. return SystemDNSPlaceholder
  19. }
  20. func (d *dhcpClient) Exchange(m *D.Msg) (msg *D.Msg, err error) {
  21. return d.ExchangeContext(context.Background(), m)
  22. }
  23. func (d *dhcpClient) ExchangeContext(ctx context.Context, m *D.Msg) (msg *D.Msg, err error) {
  24. if s := systemResolver; s != nil {
  25. return s.ExchangeContext(ctx, m)
  26. }
  27. return nil, dhcp.ErrNotFound
  28. }
  29. func ServeDNSWithDefaultServer(msg *D.Msg) (*D.Msg, error) {
  30. if h := isolateHandler; h != nil {
  31. return handlerWithContext(context.Background(), h, msg)
  32. }
  33. return nil, D.ErrTime
  34. }
  35. func FlushCacheWithDefaultResolver() {
  36. if r := resolver.DefaultResolver; r != nil {
  37. r.(*Resolver).cache = lru.New(lru.WithSize[string, *D.Msg](4096), lru.WithStale[string, *D.Msg](true))
  38. }
  39. }
  40. func UpdateSystemDNS(addr []string) {
  41. if len(addr) == 0 {
  42. systemResolver = nil
  43. }
  44. ns := make([]NameServer, 0, len(addr))
  45. for _, d := range addr {
  46. ns = append(ns, NameServer{Addr: d})
  47. }
  48. systemResolver = NewResolver(Config{Main: ns})
  49. }
  50. func UpdateIsolateHandler(resolver *Resolver, mapper *ResolverEnhancer) {
  51. if resolver == nil {
  52. isolateHandler = nil
  53. return
  54. }
  55. isolateHandler = NewHandler(resolver, mapper)
  56. }
  57. func newDHCPClient(ifaceName string) *dhcpClient {
  58. return &dhcpClient{enable: ifaceName == SystemDNSPlaceholder}
  59. }