mirror of
				https://github.com/tailscale/tailscale.git
				synced 2025-11-04 00:55:11 +00:00 
			
		
		
		
	To atone for1d7f9d5b4a, the revert of4224b3f731. At least it's fast again, even if it's shelling out to cmd.exe (once now). Updates #1478 Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
		
			
				
	
	
		
			40 lines
		
	
	
		
			962 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			40 lines
		
	
	
		
			962 B
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright (c) 2020 Tailscale Inc & AUTHORS All rights reserved.
 | 
						|
// Use of this source code is governed by a BSD-style
 | 
						|
// license that can be found in the LICENSE file.
 | 
						|
 | 
						|
package controlclient
 | 
						|
 | 
						|
import (
 | 
						|
	"os/exec"
 | 
						|
	"strings"
 | 
						|
	"sync/atomic"
 | 
						|
	"syscall"
 | 
						|
)
 | 
						|
 | 
						|
func init() {
 | 
						|
	osVersion = osVersionWindows
 | 
						|
}
 | 
						|
 | 
						|
var winVerCache atomic.Value // of string
 | 
						|
 | 
						|
func osVersionWindows() string {
 | 
						|
	if s, ok := winVerCache.Load().(string); ok {
 | 
						|
		return s
 | 
						|
	}
 | 
						|
	cmd := exec.Command("cmd", "/c", "ver")
 | 
						|
	cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
 | 
						|
	out, _ := cmd.Output() // "\nMicrosoft Windows [Version 10.0.19041.388]\n\n"
 | 
						|
	s := strings.TrimSpace(string(out))
 | 
						|
	s = strings.TrimPrefix(s, "Microsoft Windows [")
 | 
						|
	s = strings.TrimSuffix(s, "]")
 | 
						|
 | 
						|
	// "Version 10.x.y.z", with "Version" localized. Keep only stuff after the space.
 | 
						|
	if sp := strings.Index(s, " "); sp != -1 {
 | 
						|
		s = s[sp+1:]
 | 
						|
	}
 | 
						|
	if s != "" {
 | 
						|
		winVerCache.Store(s)
 | 
						|
	}
 | 
						|
	return s // "10.0.19041.388", ideally
 | 
						|
}
 |