resolv_darwin_cgo.go 973 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. //go:build darwin && cgo
  2. package local
  3. /*
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include <resolv.h>
  7. #include <arpa/inet.h>
  8. */
  9. import "C"
  10. import (
  11. "time"
  12. E "github.com/sagernet/sing/common/exceptions"
  13. "github.com/miekg/dns"
  14. )
  15. func dnsReadConfig(_ string) *dnsConfig {
  16. if C.res_init() != 0 {
  17. return &dnsConfig{
  18. servers: defaultNS,
  19. search: dnsDefaultSearch(),
  20. ndots: 1,
  21. timeout: 5 * time.Second,
  22. attempts: 2,
  23. err: E.New("libresolv initialization failed"),
  24. }
  25. }
  26. conf := &dnsConfig{
  27. ndots: 1,
  28. timeout: 5 * time.Second,
  29. attempts: int(C._res.retry),
  30. }
  31. for i := 0; i < int(C._res.nscount); i++ {
  32. ns := C._res.nsaddr_list[i]
  33. addr := C.inet_ntoa(ns.sin_addr)
  34. if addr == nil {
  35. continue
  36. }
  37. conf.servers = append(conf.servers, C.GoString(addr))
  38. }
  39. for i := 0; ; i++ {
  40. search := C._res.dnsrch[i]
  41. if search == nil {
  42. break
  43. }
  44. conf.search = append(conf.search, dns.Fqdn(C.GoString(search)))
  45. }
  46. return conf
  47. }