|
|
|
|
@ -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 { |
|
|
|
|
|