From afb9c6a6abc9fa5a26200cc36d1ffc947b8b9e89 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Wed, 27 May 2020 12:50:41 -0700 Subject: [PATCH] control/controlclient: use "getprop net.hostname" for Android hostname Updates #409 --- control/controlclient/direct.go | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/control/controlclient/direct.go b/control/controlclient/direct.go index 626afab87..e8dc7d614 100644 --- a/control/controlclient/direct.go +++ b/control/controlclient/direct.go @@ -18,7 +18,9 @@ import ( "net/http" "net/url" "os" + "os/exec" "reflect" + "runtime" "strconv" "strings" "sync" @@ -159,7 +161,13 @@ func NewDirect(opts Options) (*Direct, error) { } func NewHostinfo() *tailcfg.Hostinfo { - hostname, _ := os.Hostname() + var hostname string + if runtime.GOOS == "android" { + hostname = androidHostname() + } + if hostname == "" { + hostname, _ = os.Hostname() + } return &tailcfg.Hostinfo{ IPNVersion: version.LONG, Hostname: hostname, @@ -167,6 +175,20 @@ func NewHostinfo() *tailcfg.Hostinfo { } } +var androidHostnameOnce struct { + _ structs.Incomparable + sync.Once + v string +} + +func androidHostname() string { + androidHostnameOnce.Do(func() { + out, _ := exec.Command("getprop", "net.hostname").Output() + androidHostnameOnce.v = strings.TrimSpace(string(out)) + }) + return androidHostnameOnce.v +} + // SetHostinfo clones the provided Hostinfo and remembers it for the // next update. It reports whether the Hostinfo has changed. func (c *Direct) SetHostinfo(hi *tailcfg.Hostinfo) bool {