portlist: set SysProcAttr.HideWindow on Windows

Prevents annoying shell window flashes when running /server by hand.
This commit is contained in:
Brad Fitzpatrick 2020-06-08 09:04:31 -07:00
parent 07ca0c1c29
commit 2ca2389c5f
2 changed files with 20 additions and 1 deletions

View File

@ -13,12 +13,22 @@ import (
exec "tailscale.com/tempfork/osexec"
)
var osHideWindow func(*exec.Cmd) // non-nil on Windows; see portlist_windows.go
// hideWindow returns c. On Windows it first sets SysProcAttr.HideWindow.
func hideWindow(c *exec.Cmd) *exec.Cmd {
if osHideWindow != nil {
osHideWindow(c)
}
return c
}
func listPortsNetstat(arg string) (List, error) {
exe, err := exec.LookPath("netstat")
if err != nil {
return nil, fmt.Errorf("netstat: lookup: %v", err)
}
output, err := exec.Command(exe, arg).Output()
output, err := hideWindow(exec.Command(exe, arg)).Output()
if err != nil {
xe, ok := err.(*exec.ExitError)
stderr := ""

View File

@ -5,7 +5,10 @@
package portlist
import (
"syscall"
"time"
exec "tailscale.com/tempfork/osexec"
)
// Forking on Windows is insanely expensive, so don't do it too often.
@ -18,3 +21,9 @@ func listPorts() (List, error) {
func addProcesses(pl []Port) ([]Port, error) {
return listPortsNetstat("-nab")
}
func init() {
osHideWindow = func(c *exec.Cmd) {
c.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
}
}