Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / tools@v0.0.0-20201105173854-bc9fc8d8c4bc / cmd / getgo / system_windows.go
1 // Copyright 2017 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 // +build windows
6
7 package main
8
9 import (
10         "context"
11         "log"
12         "os"
13         "syscall"
14         "unsafe"
15 )
16
17 const (
18         envSeparator = ";"
19         homeKey      = "USERPROFILE"
20         lineEnding   = "/r/n"
21         pathVar      = "$env:Path"
22 )
23
24 var installPath = `c:\go`
25
26 func isWindowsXP() bool {
27         v, err := syscall.GetVersion()
28         if err != nil {
29                 log.Fatalf("GetVersion failed: %v", err)
30         }
31         major := byte(v)
32         return major < 6
33 }
34
35 func whichGo(ctx context.Context) (string, error) {
36         return findGo(ctx, "where")
37 }
38
39 // currentShell reports the current shell.
40 // It might be "powershell.exe", "cmd.exe" or any of the *nix shells.
41 //
42 // Returns empty string if the shell is unknown.
43 func currentShell() string {
44         shell := os.Getenv("SHELL")
45         if shell != "" {
46                 return shell
47         }
48
49         pid := os.Getppid()
50         pe, err := getProcessEntry(pid)
51         if err != nil {
52                 verbosef("getting shell from process entry failed: %v", err)
53                 return ""
54         }
55
56         return syscall.UTF16ToString(pe.ExeFile[:])
57 }
58
59 func getProcessEntry(pid int) (*syscall.ProcessEntry32, error) {
60         // From https://go.googlesource.com/go/+/go1.8.3/src/syscall/syscall_windows.go#941
61         snapshot, err := syscall.CreateToolhelp32Snapshot(syscall.TH32CS_SNAPPROCESS, 0)
62         if err != nil {
63                 return nil, err
64         }
65         defer syscall.CloseHandle(snapshot)
66
67         var procEntry syscall.ProcessEntry32
68         procEntry.Size = uint32(unsafe.Sizeof(procEntry))
69         if err = syscall.Process32First(snapshot, &procEntry); err != nil {
70                 return nil, err
71         }
72
73         for {
74                 if procEntry.ProcessID == uint32(pid) {
75                         return &procEntry, nil
76                 }
77
78                 if err := syscall.Process32Next(snapshot, &procEntry); err != nil {
79                         return nil, err
80                 }
81         }
82 }
83
84 func persistEnvChangesForSession() error {
85         return nil
86 }