Skip to content

Instantly share code, notes, and snippets.

@cs8425
Last active March 5, 2025 08:30
Show Gist options
  • Save cs8425/107e01a0652f1f1f6e033b5b68364b5e to your computer and use it in GitHub Desktop.
Save cs8425/107e01a0652f1f1f6e033b5b68364b5e to your computer and use it in GitHub Desktop.

Revisions

  1. cs8425 revised this gist Mar 21, 2019. 1 changed file with 31 additions and 10 deletions.
    41 changes: 31 additions & 10 deletions setDefaultNS.go
    Original file line number Diff line number Diff line change
    @@ -46,16 +46,30 @@ type resolverConfig struct {
    dnsConfig *dnsConfig // parsed resolv.conf structure used in lookups
    }

    func setDefaultNS(addrs []string) {
    now := time.Now()
    resolvConf.dnsConfig.mtime = now
    resolvConf.lastChecked = now

    //go:linkname (*resolverConfig).tryUpdate net.(*resolverConfig).tryUpdate
    func (conf *resolverConfig) tryUpdate(name string)
    // need to put a empty .s file


    func setDefaultNS(addrs []string, loadFromSystem bool) {
    if resolvConf.dnsConfig == nil {
    resolvConf.tryUpdate("")
    }

    if loadFromSystem {
    now := time.Now()
    resolvConf.lastChecked = now.Add(-6 * time.Second)
    resolvConf.dnsConfig.mtime = now
    }

    resolvConf.dnsConfig.servers = addrs
    defaultNS = addrs
    }

    // --------------


    func test() {
    ips, err := net.LookupIP("google.com")
    if err != nil {
    @@ -66,15 +80,22 @@ func test() {
    }

    func main() {
    // test default
    test()
    // force use a non-exist DNS server
    setDefaultNS([]string{"127.0.0.1:5300"}, false)
    test() // error
    fmt.Println("------------------")


    // force use a list of DNS server
    setDefaultNS([]string{"8.8.8.8:53", "1.1.1.1:53"}, false)
    test() // ok
    fmt.Println("------------------")

    // set DNS
    setDefaultNS([]string{"8.8.8.8:53", "1.1.1.1:53"})

    // set DNS & try reload from system config
    setDefaultNS([]string{"127.0.0.1:5300"}, true)

    // check & test net.defaultNS
    fmt.Println("use DNS", defaultNS)
    test()
    test() // ok
    fmt.Println("------------------")
    }
  2. cs8425 revised this gist Mar 21, 2019. 2 changed files with 46 additions and 27 deletions.
    29 changes: 2 additions & 27 deletions setDefaultNS.go
    Original file line number Diff line number Diff line change
    @@ -11,6 +11,8 @@ import (

    // DNS resolve workaround for android in pure go

    //go:linkname defaultNS net.defaultNS
    var defaultNS []string

    // need to keep sync with go version
    //go:linkname resolvConf net.resolvConf
    @@ -54,7 +56,6 @@ func setDefaultNS(addrs []string) {

    // --------------


    func test() {
    ips, err := net.LookupIP("google.com")
    if err != nil {
    @@ -77,29 +78,3 @@ func main() {
    test()
    fmt.Println("------------------")
    }


    // --------------

    // this only work before any Lookup call and net.dnsReadConfig() failed
    //go:linkname defaultNS net.defaultNS
    var defaultNS []string

    func setDefaultNS2(addrs []string) {
    defaultNS = addrs
    }

    func main2() {
    // print net.defaultNS
    fmt.Println("use DNS", defaultNS)
    //test() // should setup before any call!!
    fmt.Println("------------------")

    // set net.defaultNS
    setDefaultNS2([]string{"8.8.8.8:53", "1.1.1.1:53"})

    // check & test net.defaultNS
    fmt.Println("use DNS", defaultNS)
    test()
    fmt.Println("------------------")
    }
    44 changes: 44 additions & 0 deletions setDefaultNS2.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,44 @@
    package main

    import (
    "fmt"

    "net"
    _ "unsafe"
    )

    // DNS resolve workaround for android in pure go

    // this only work before any Lookup call and net.dnsReadConfig() failed
    //go:linkname defaultNS net.defaultNS
    var defaultNS []string

    func setDefaultNS2(addrs []string) {
    defaultNS = addrs
    }

    // --------------

    func test() {
    ips, err := net.LookupIP("google.com")
    if err != nil {
    fmt.Printf("Could not get IPs: %v\n", err)
    return
    }
    fmt.Println("IPs:", ips)
    }

    func main() {
    // print net.defaultNS
    fmt.Println("use DNS", defaultNS)
    //test() // should setup before any call!!
    fmt.Println("------------------")

    // set net.defaultNS
    setDefaultNS2([]string{"8.8.8.8:53", "1.1.1.1:53"})

    // check & test net.defaultNS
    fmt.Println("use DNS", defaultNS)
    test()
    fmt.Println("------------------")
    }
  3. cs8425 revised this gist Mar 21, 2019. 1 changed file with 69 additions and 5 deletions.
    74 changes: 69 additions & 5 deletions setDefaultNS.go
    Original file line number Diff line number Diff line change
    @@ -4,18 +4,57 @@ import (
    "fmt"

    "net"
    "sync"
    "time"
    _ "unsafe"
    )

    // DNS resolve workaround for android in pure go

    //go:linkname defaultNS net.defaultNS
    var defaultNS []string

    // need to keep sync with go version
    //go:linkname resolvConf net.resolvConf
    var resolvConf resolverConfig

    // copy from /src/net/dnsconfig_unix.go
    type dnsConfig struct {
    servers []string // server addresses (in host:port form) to use
    search []string // rooted suffixes to append to local name
    ndots int // number of dots in name to trigger absolute lookup
    timeout time.Duration // wait before giving up on a query, including retries
    attempts int // lost packets before giving up on server
    rotate bool // round robin among servers
    unknownOpt bool // anything unknown was encountered
    lookup []string // OpenBSD top-level database "lookup" order
    err error // any error that occurs during open of resolv.conf
    mtime time.Time // time of resolv.conf modification
    soffset uint32 // used by serverOffset
    }

    // copy from /src/net/dnsclient_unix.go
    type resolverConfig struct {
    initOnce sync.Once // guards init of resolverConfig

    // ch is used as a semaphore that only allows one lookup at a
    // time to recheck resolv.conf.
    ch chan struct{} // guards lastChecked and modTime
    lastChecked time.Time // last time resolv.conf was checked

    mu sync.RWMutex // protects dnsConfig
    dnsConfig *dnsConfig // parsed resolv.conf structure used in lookups
    }

    func setDefaultNS(addrs []string) {
    now := time.Now()
    resolvConf.dnsConfig.mtime = now
    resolvConf.lastChecked = now
    resolvConf.dnsConfig.servers = addrs
    defaultNS = addrs
    }

    // --------------


    func test() {
    ips, err := net.LookupIP("google.com")
    if err != nil {
    @@ -26,16 +65,41 @@ func test() {
    }

    func main() {
    // test default
    test()
    fmt.Println("------------------")

    // set DNS
    setDefaultNS([]string{"8.8.8.8:53", "1.1.1.1:53"})

    // check & test net.defaultNS
    fmt.Println("use DNS", defaultNS)
    test()
    fmt.Println("------------------")
    }


    // --------------

    // this only work before any Lookup call and net.dnsReadConfig() failed
    //go:linkname defaultNS net.defaultNS
    var defaultNS []string

    func setDefaultNS2(addrs []string) {
    defaultNS = addrs
    }

    func main2() {
    // print net.defaultNS
    fmt.Println(defaultNS)
    fmt.Println("use DNS", defaultNS)
    //test() // should setup before any call!!
    fmt.Println("------------------")

    // set net.defaultNS
    setDefaultNS([]string{"8.8.8.8:53", "1.1.1.1:53"})
    setDefaultNS2([]string{"8.8.8.8:53", "1.1.1.1:53"})

    // check & test net.defaultNS
    fmt.Println(defaultNS)
    fmt.Println("use DNS", defaultNS)
    test()
    fmt.Println("------------------")
    }
  4. cs8425 revised this gist Mar 21, 2019. 1 changed file with 1 addition and 8 deletions.
    9 changes: 1 addition & 8 deletions setDefaultNS.go
    Original file line number Diff line number Diff line change
    @@ -4,7 +4,6 @@ import (
    "fmt"

    "net"
    "reflect"
    _ "unsafe"
    )

    @@ -14,13 +13,7 @@ import (
    var defaultNS []string

    func setDefaultNS(addrs []string) {
    valuePtr := reflect.ValueOf(&defaultNS)
    v := valuePtr.Elem()

    v.Set(reflect.MakeSlice(v.Type(), len(addrs), len(addrs)))
    for i, w := range addrs {
    v.Index(i).Set(reflect.ValueOf(w))
    }
    defaultNS = addrs
    }

    func test() {
  5. cs8425 revised this gist Mar 20, 2019. 1 changed file with 4 additions and 4 deletions.
    8 changes: 4 additions & 4 deletions setDefaultNS.go
    Original file line number Diff line number Diff line change
    @@ -13,8 +13,8 @@ import (
    //go:linkname defaultNS net.defaultNS
    var defaultNS []string

    func setSlice(arrPtr interface{}, addrs []string) {
    valuePtr := reflect.ValueOf(arrPtr)
    func setDefaultNS(addrs []string) {
    valuePtr := reflect.ValueOf(&defaultNS)
    v := valuePtr.Elem()

    v.Set(reflect.MakeSlice(v.Type(), len(addrs), len(addrs)))
    @@ -39,9 +39,9 @@ func main() {
    fmt.Println("------------------")

    // set net.defaultNS
    setSlice(&defaultNS, []string{"8.8.8.8:53", "1.1.1.1:53"})
    setDefaultNS([]string{"8.8.8.8:53", "1.1.1.1:53"})

    // check net.defaultNS
    // check & test net.defaultNS
    fmt.Println(defaultNS)
    test()
    fmt.Println("------------------")
  6. cs8425 revised this gist Mar 20, 2019. No changes.
  7. cs8425 revised this gist Mar 20, 2019. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion setDefaultNS.go
    Original file line number Diff line number Diff line change
    @@ -8,7 +8,7 @@ import (
    _ "unsafe"
    )

    // DNS resolve work around for android in pure go
    // DNS resolve workaround for android in pure go

    //go:linkname defaultNS net.defaultNS
    var defaultNS []string
  8. cs8425 revised this gist Mar 20, 2019. 1 changed file with 12 additions and 1 deletion.
    13 changes: 12 additions & 1 deletion setDefaultNS.go
    Original file line number Diff line number Diff line change
    @@ -3,9 +3,9 @@ package main
    import (
    "fmt"

    "net"
    "reflect"
    _ "unsafe"
    _ "net"
    )

    // DNS resolve work around for android in pure go
    @@ -23,15 +23,26 @@ func setSlice(arrPtr interface{}, addrs []string) {
    }
    }

    func test() {
    ips, err := net.LookupIP("google.com")
    if err != nil {
    fmt.Printf("Could not get IPs: %v\n", err)
    return
    }
    fmt.Println("IPs:", ips)
    }

    func main() {
    // print net.defaultNS
    fmt.Println(defaultNS)
    //test() // should setup before any call!!
    fmt.Println("------------------")

    // set net.defaultNS
    setSlice(&defaultNS, []string{"8.8.8.8:53", "1.1.1.1:53"})

    // check net.defaultNS
    fmt.Println(defaultNS)
    test()
    fmt.Println("------------------")
    }
  9. cs8425 created this gist Mar 20, 2019.
    37 changes: 37 additions & 0 deletions setDefaultNS.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,37 @@
    package main

    import (
    "fmt"

    "reflect"
    _ "unsafe"
    _ "net"
    )

    // DNS resolve work around for android in pure go

    //go:linkname defaultNS net.defaultNS
    var defaultNS []string

    func setSlice(arrPtr interface{}, addrs []string) {
    valuePtr := reflect.ValueOf(arrPtr)
    v := valuePtr.Elem()

    v.Set(reflect.MakeSlice(v.Type(), len(addrs), len(addrs)))
    for i, w := range addrs {
    v.Index(i).Set(reflect.ValueOf(w))
    }
    }

    func main() {
    // print net.defaultNS
    fmt.Println(defaultNS)
    fmt.Println("------------------")

    // set net.defaultNS
    setSlice(&defaultNS, []string{"8.8.8.8:53", "1.1.1.1:53"})

    // check net.defaultNS
    fmt.Println(defaultNS)
    fmt.Println("------------------")
    }