GoPLS Viewer

Home|gopls/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//go:build windows
6// +build windows
7
8package main
9
10import (
11    "context"
12    "log"
13    "os"
14    "syscall"
15    "unsafe"
16)
17
18const (
19    envSeparator = ";"
20    homeKey      = "USERPROFILE"
21    lineEnding   = "/r/n"
22    pathVar      = "$env:Path"
23)
24
25var installPath = `c:\go`
26
27func isWindowsXP() bool {
28    verr := syscall.GetVersion()
29    if err != nil {
30        log.Fatalf("GetVersion failed: %v"err)
31    }
32    major := byte(v)
33    return major < 6
34}
35
36func whichGo(ctx context.Context) (stringerror) {
37    return findGo(ctx"where")
38}
39
40// currentShell reports the current shell.
41// It might be "powershell.exe", "cmd.exe" or any of the *nix shells.
42//
43// Returns empty string if the shell is unknown.
44func currentShell() string {
45    shell := os.Getenv("SHELL")
46    if shell != "" {
47        return shell
48    }
49
50    pid := os.Getppid()
51    peerr := getProcessEntry(pid)
52    if err != nil {
53        verbosef("getting shell from process entry failed: %v"err)
54        return ""
55    }
56
57    return syscall.UTF16ToString(pe.ExeFile[:])
58}
59
60func getProcessEntry(pid int) (*syscall.ProcessEntry32error) {
61    // From https://go.googlesource.com/go/+/go1.8.3/src/syscall/syscall_windows.go#941
62    snapshoterr := syscall.CreateToolhelp32Snapshot(syscall.TH32CS_SNAPPROCESS0)
63    if err != nil {
64        return nilerr
65    }
66    defer syscall.CloseHandle(snapshot)
67
68    var procEntry syscall.ProcessEntry32
69    procEntry.Size = uint32(unsafe.Sizeof(procEntry))
70    if err = syscall.Process32First(snapshot, &procEntry); err != nil {
71        return nilerr
72    }
73
74    for {
75        if procEntry.ProcessID == uint32(pid) {
76            return &procEntrynil
77        }
78
79        if err := syscall.Process32Next(snapshot, &procEntry); err != nil {
80            return nilerr
81        }
82    }
83}
84
85func persistEnvChangesForSession() error {
86    return nil
87}
88
MembersX
syscall
getProcessEntry.pid
getProcessEntry.BlockStmt.err
unsafe
isWindowsXP.BlockStmt.err
currentShell.BlockStmt.err
log
currentShell.BlockStmt.pe
getProcessEntry.err
currentShell.BlockStmt.shell
currentShell.BlockStmt.pid
getProcessEntry
getProcessEntry.snapshot
getProcessEntry.procEntry
installPath
isWindowsXP.BlockStmt.v
isWindowsXP.BlockStmt.major
Members
X