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 {