Commit 01b7c2db authored by Brad Fitzpatrick's avatar Brad Fitzpatrick

cmd/vendor: update golang.org/x/sys/windows for windows/arm support

Updates to golang.org/x/sys git rev 90868a75f.

Updates golang/go#26148

Change-Id: Ic687e7e0e171690e8d937c7bb29b0e55316f874a
Reviewed-on: https://go-review.googlesource.com/137015Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
parent f493e557
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build windows
// +build go1.9
package windows
import "syscall"
type Errno = syscall.Errno
type SysProcAttr = syscall.SysProcAttr
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
#include "textflag.h"
TEXT ·getprocaddress(SB),NOSPLIT,$0
B syscall·getprocaddress(SB)
TEXT ·loadlibrary(SB),NOSPLIT,$0
B syscall·loadlibrary(SB)
// MACHINE GENERATED BY 'go generate' COMMAND; DO NOT EDIT // Code generated by 'go generate'; DO NOT EDIT.
package registry package registry
......
...@@ -296,6 +296,7 @@ const ( ...@@ -296,6 +296,7 @@ const (
TOKEN_ADJUST_PRIVILEGES TOKEN_ADJUST_PRIVILEGES
TOKEN_ADJUST_GROUPS TOKEN_ADJUST_GROUPS
TOKEN_ADJUST_DEFAULT TOKEN_ADJUST_DEFAULT
TOKEN_ADJUST_SESSIONID
TOKEN_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | TOKEN_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED |
TOKEN_ASSIGN_PRIMARY | TOKEN_ASSIGN_PRIMARY |
...@@ -305,7 +306,8 @@ const ( ...@@ -305,7 +306,8 @@ const (
TOKEN_QUERY_SOURCE | TOKEN_QUERY_SOURCE |
TOKEN_ADJUST_PRIVILEGES | TOKEN_ADJUST_PRIVILEGES |
TOKEN_ADJUST_GROUPS | TOKEN_ADJUST_GROUPS |
TOKEN_ADJUST_DEFAULT TOKEN_ADJUST_DEFAULT |
TOKEN_ADJUST_SESSIONID
TOKEN_READ = STANDARD_RIGHTS_READ | TOKEN_QUERY TOKEN_READ = STANDARD_RIGHTS_READ | TOKEN_QUERY
TOKEN_WRITE = STANDARD_RIGHTS_WRITE | TOKEN_WRITE = STANDARD_RIGHTS_WRITE |
TOKEN_ADJUST_PRIVILEGES | TOKEN_ADJUST_PRIVILEGES |
......
...@@ -43,6 +43,11 @@ const ( ...@@ -43,6 +43,11 @@ const (
SC_STATUS_PROCESS_INFO = 0 SC_STATUS_PROCESS_INFO = 0
SC_ACTION_NONE = 0
SC_ACTION_RESTART = 1
SC_ACTION_REBOOT = 2
SC_ACTION_RUN_COMMAND = 3
SERVICE_STOPPED = 1 SERVICE_STOPPED = 1
SERVICE_START_PENDING = 2 SERVICE_START_PENDING = 2
SERVICE_STOP_PENDING = 3 SERVICE_STOP_PENDING = 3
...@@ -148,6 +153,19 @@ type ENUM_SERVICE_STATUS_PROCESS struct { ...@@ -148,6 +153,19 @@ type ENUM_SERVICE_STATUS_PROCESS struct {
ServiceStatusProcess SERVICE_STATUS_PROCESS ServiceStatusProcess SERVICE_STATUS_PROCESS
} }
type SERVICE_FAILURE_ACTIONS struct {
ResetPeriod uint32
RebootMsg *uint16
Command *uint16
ActionsCount uint32
Actions *SC_ACTION
}
type SC_ACTION struct {
Type uint32
Delay uint32
}
//sys CloseServiceHandle(handle Handle) (err error) = advapi32.CloseServiceHandle //sys CloseServiceHandle(handle Handle) (err error) = advapi32.CloseServiceHandle
//sys CreateService(mgr Handle, serviceName *uint16, displayName *uint16, access uint32, srvType uint32, startType uint32, errCtl uint32, pathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16) (handle Handle, err error) [failretval==0] = advapi32.CreateServiceW //sys CreateService(mgr Handle, serviceName *uint16, displayName *uint16, access uint32, srvType uint32, startType uint32, errCtl uint32, pathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16) (handle Handle, err error) [failretval==0] = advapi32.CreateServiceW
//sys OpenService(mgr Handle, serviceName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenServiceW //sys OpenService(mgr Handle, serviceName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenServiceW
......
...@@ -88,23 +88,11 @@ func (s *Service) Config() (Config, error) { ...@@ -88,23 +88,11 @@ func (s *Service) Config() (Config, error) {
} }
} }
var p2 *windows.SERVICE_DESCRIPTION b, err := s.queryServiceConfig2(windows.SERVICE_CONFIG_DESCRIPTION)
n = uint32(1024) if err != nil {
for { return Config{}, err
b := make([]byte, n)
p2 = (*windows.SERVICE_DESCRIPTION)(unsafe.Pointer(&b[0]))
err := windows.QueryServiceConfig2(s.Handle,
windows.SERVICE_CONFIG_DESCRIPTION, &b[0], n, &n)
if err == nil {
break
}
if err.(syscall.Errno) != syscall.ERROR_INSUFFICIENT_BUFFER {
return Config{}, err
}
if n <= uint32(len(b)) {
return Config{}, err
}
} }
p2 := (*windows.SERVICE_DESCRIPTION)(unsafe.Pointer(&b[0]))
return Config{ return Config{
ServiceType: p.ServiceType, ServiceType: p.ServiceType,
...@@ -137,3 +125,21 @@ func (s *Service) UpdateConfig(c Config) error { ...@@ -137,3 +125,21 @@ func (s *Service) UpdateConfig(c Config) error {
} }
return updateDescription(s.Handle, c.Description) return updateDescription(s.Handle, c.Description)
} }
// queryServiceConfig2 calls Windows QueryServiceConfig2 with infoLevel parameter and returns retrieved service configuration information.
func (s *Service) queryServiceConfig2(infoLevel uint32) ([]byte, error) {
n := uint32(1024)
for {
b := make([]byte, n)
err := windows.QueryServiceConfig2(s.Handle, infoLevel, &b[0], n, &n)
if err == nil {
return b, nil
}
if err.(syscall.Errno) != syscall.ERROR_INSUFFICIENT_BUFFER {
return nil, err
}
if n <= uint32(len(b)) {
return nil, err
}
}
}
...@@ -95,6 +95,113 @@ func testConfig(t *testing.T, s *mgr.Service, should mgr.Config) mgr.Config { ...@@ -95,6 +95,113 @@ func testConfig(t *testing.T, s *mgr.Service, should mgr.Config) mgr.Config {
return is return is
} }
func testRecoveryActions(t *testing.T, s *mgr.Service, should []mgr.RecoveryAction) {
is, err := s.RecoveryActions()
if err != nil {
t.Fatalf("RecoveryActions failed: %s", err)
}
if len(should) != len(is) {
t.Errorf("recovery action mismatch: contains %v actions, but should have %v", len(is), len(should))
}
for i, _ := range is {
if should[i].Type != is[i].Type {
t.Errorf("recovery action mismatch: Type is %v, but should have %v", is[i].Type, should[i].Type)
}
if should[i].Delay != is[i].Delay {
t.Errorf("recovery action mismatch: Delay is %v, but should have %v", is[i].Delay, should[i].Delay)
}
}
}
func testResetPeriod(t *testing.T, s *mgr.Service, should uint32) {
is, err := s.ResetPeriod()
if err != nil {
t.Fatalf("ResetPeriod failed: %s", err)
}
if should != is {
t.Errorf("reset period mismatch: reset period is %v, but should have %v", is, should)
}
}
func testSetRecoveryActions(t *testing.T, s *mgr.Service) {
r := []mgr.RecoveryAction{
mgr.RecoveryAction{
Type: mgr.NoAction,
Delay: 60000 * time.Millisecond,
},
mgr.RecoveryAction{
Type: mgr.ServiceRestart,
Delay: 4 * time.Minute,
},
mgr.RecoveryAction{
Type: mgr.ServiceRestart,
Delay: time.Minute,
},
mgr.RecoveryAction{
Type: mgr.RunCommand,
Delay: 4000 * time.Millisecond,
},
}
// 4 recovery actions with reset period
err := s.SetRecoveryActions(r, uint32(10000))
if err != nil {
t.Fatalf("SetRecoveryActions failed: %v", err)
}
testRecoveryActions(t, s, r)
testResetPeriod(t, s, uint32(10000))
// Infinite reset period
err = s.SetRecoveryActions(r, syscall.INFINITE)
if err != nil {
t.Fatalf("SetRecoveryActions failed: %v", err)
}
testRecoveryActions(t, s, r)
testResetPeriod(t, s, syscall.INFINITE)
// nil recovery actions
err = s.SetRecoveryActions(nil, 0)
if err.Error() != "recoveryActions cannot be nil" {
t.Fatalf("SetRecoveryActions failed with unexpected error message of %q", err)
}
// Delete all recovery actions and reset period
err = s.ResetRecoveryActions()
if err != nil {
t.Fatalf("ResetRecoveryActions failed: %v", err)
}
testRecoveryActions(t, s, nil)
testResetPeriod(t, s, 0)
}
func testRebootMessage(t *testing.T, s *mgr.Service, should string) {
err := s.SetRebootMessage(should)
if err != nil {
t.Fatalf("SetRebootMessage failed: %v", err)
}
is, err := s.RebootMessage()
if err != nil {
t.Fatalf("RebootMessage failed: %v", err)
}
if should != is {
t.Errorf("reboot message mismatch: message is %q, but should have %q", is, should)
}
}
func testRecoveryCommand(t *testing.T, s *mgr.Service, should string) {
err := s.SetRecoveryCommand(should)
if err != nil {
t.Fatalf("SetRecoveryCommand failed: %v", err)
}
is, err := s.RecoveryCommand()
if err != nil {
t.Fatalf("RecoveryCommand failed: %v", err)
}
if should != is {
t.Errorf("recovery command mismatch: command is %q, but should have %q", is, should)
}
}
func remove(t *testing.T, s *mgr.Service) { func remove(t *testing.T, s *mgr.Service) {
err := s.Delete() err := s.Delete()
if err != nil { if err != nil {
...@@ -165,5 +272,11 @@ func TestMyService(t *testing.T) { ...@@ -165,5 +272,11 @@ func TestMyService(t *testing.T) {
t.Errorf("ListServices failed to find %q service", name) t.Errorf("ListServices failed to find %q service", name)
} }
testSetRecoveryActions(t, s)
testRebootMessage(t, s, "myservice failed")
testRebootMessage(t, s, "") // delete reboot message
testRecoveryCommand(t, s, "sc query myservice")
testRecoveryCommand(t, s, "") // delete recovery command
remove(t, s) remove(t, s)
} }
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build windows
package mgr
import (
"errors"
"syscall"
"time"
"unsafe"
"golang.org/x/sys/windows"
)
const (
// Possible recovery actions that the service control manager can perform.
NoAction = windows.SC_ACTION_NONE // no action
ComputerReboot = windows.SC_ACTION_REBOOT // reboot the computer
ServiceRestart = windows.SC_ACTION_RESTART // restart the service
RunCommand = windows.SC_ACTION_RUN_COMMAND // run a command
)
// RecoveryAction represents an action that the service control manager can perform when service fails.
// A service is considered failed when it terminates without reporting a status of SERVICE_STOPPED to the service controller.
type RecoveryAction struct {
Type int // one of NoAction, ComputerReboot, ServiceRestart or RunCommand
Delay time.Duration // the time to wait before performing the specified action
}
// SetRecoveryActions sets actions that service controller performs when service fails and
// the time after which to reset the service failure count to zero if there are no failures, in seconds.
// Specify INFINITE to indicate that service failure count should never be reset.
func (s *Service) SetRecoveryActions(recoveryActions []RecoveryAction, resetPeriod uint32) error {
if recoveryActions == nil {
return errors.New("recoveryActions cannot be nil")
}
actions := []windows.SC_ACTION{}
for _, a := range recoveryActions {
action := windows.SC_ACTION{
Type: uint32(a.Type),
Delay: uint32(a.Delay.Nanoseconds() / 1000000),
}
actions = append(actions, action)
}
rActions := windows.SERVICE_FAILURE_ACTIONS{
ActionsCount: uint32(len(actions)),
Actions: &actions[0],
ResetPeriod: resetPeriod,
}
return windows.ChangeServiceConfig2(s.Handle, windows.SERVICE_CONFIG_FAILURE_ACTIONS, (*byte)(unsafe.Pointer(&rActions)))
}
// RecoveryActions returns actions that service controller performs when service fails.
// The service control manager counts the number of times service s has failed since the system booted.
// The count is reset to 0 if the service has not failed for ResetPeriod seconds.
// When the service fails for the Nth time, the service controller performs the action specified in element [N-1] of returned slice.
// If N is greater than slice length, the service controller repeats the last action in the slice.
func (s *Service) RecoveryActions() ([]RecoveryAction, error) {
b, err := s.queryServiceConfig2(windows.SERVICE_CONFIG_FAILURE_ACTIONS)
if err != nil {
return nil, err
}
p := (*windows.SERVICE_FAILURE_ACTIONS)(unsafe.Pointer(&b[0]))
if p.Actions == nil {
return nil, err
}
var recoveryActions []RecoveryAction
actions := (*[1024]windows.SC_ACTION)(unsafe.Pointer(p.Actions))[:p.ActionsCount]
for _, action := range actions {
recoveryActions = append(recoveryActions, RecoveryAction{Type: int(action.Type), Delay: time.Duration(action.Delay) * time.Millisecond})
}
return recoveryActions, nil
}
// ResetRecoveryActions deletes both reset period and array of failure actions.
func (s *Service) ResetRecoveryActions() error {
actions := make([]windows.SC_ACTION, 1)
rActions := windows.SERVICE_FAILURE_ACTIONS{
Actions: &actions[0],
}
return windows.ChangeServiceConfig2(s.Handle, windows.SERVICE_CONFIG_FAILURE_ACTIONS, (*byte)(unsafe.Pointer(&rActions)))
}
// ResetPeriod is the time after which to reset the service failure
// count to zero if there are no failures, in seconds.
func (s *Service) ResetPeriod() (uint32, error) {
b, err := s.queryServiceConfig2(windows.SERVICE_CONFIG_FAILURE_ACTIONS)
if err != nil {
return 0, err
}
p := (*windows.SERVICE_FAILURE_ACTIONS)(unsafe.Pointer(&b[0]))
return p.ResetPeriod, nil
}
// SetRebootMessage sets service s reboot message.
// If msg is "", the reboot message is deleted and no message is broadcast.
func (s *Service) SetRebootMessage(msg string) error {
rActions := windows.SERVICE_FAILURE_ACTIONS{
RebootMsg: syscall.StringToUTF16Ptr(msg),
}
return windows.ChangeServiceConfig2(s.Handle, windows.SERVICE_CONFIG_FAILURE_ACTIONS, (*byte)(unsafe.Pointer(&rActions)))
}
// RebootMessage is broadcast to server users before rebooting in response to the ComputerReboot service controller action.
func (s *Service) RebootMessage() (string, error) {
b, err := s.queryServiceConfig2(windows.SERVICE_CONFIG_FAILURE_ACTIONS)
if err != nil {
return "", err
}
p := (*windows.SERVICE_FAILURE_ACTIONS)(unsafe.Pointer(&b[0]))
return toString(p.RebootMsg), nil
}
// SetRecoveryCommand sets the command line of the process to execute in response to the RunCommand service controller action.
// If cmd is "", the command is deleted and no program is run when the service fails.
func (s *Service) SetRecoveryCommand(cmd string) error {
rActions := windows.SERVICE_FAILURE_ACTIONS{
Command: syscall.StringToUTF16Ptr(cmd),
}
return windows.ChangeServiceConfig2(s.Handle, windows.SERVICE_CONFIG_FAILURE_ACTIONS, (*byte)(unsafe.Pointer(&rActions)))
}
// RecoveryCommand is the command line of the process to execute in response to the RunCommand service controller action. This process runs under the same account as the service.
func (s *Service) RecoveryCommand() (string, error) {
b, err := s.queryServiceConfig2(windows.SERVICE_CONFIG_FAILURE_ACTIONS)
if err != nil {
return "", err
}
p := (*windows.SERVICE_FAILURE_ACTIONS)(unsafe.Pointer(&b[0]))
return toString(p.Command), nil
}
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build windows
#include "textflag.h"
// func servicemain(argc uint32, argv **uint16)
TEXT ·servicemain(SB),NOSPLIT|NOFRAME,$0
MOVM.DB.W [R4, R14], (R13) // push {r4, lr}
MOVW R13, R4
BIC $0x7, R13 // alignment for ABI
MOVW R0, ·sArgc(SB)
MOVW R1, ·sArgv(SB)
MOVW ·sName(SB), R0
MOVW ·ctlHandlerExProc(SB), R1
MOVW $0, R2
MOVW ·cRegisterServiceCtrlHandlerExW(SB), R3
BL (R3)
CMP $0, R0
BEQ exit
MOVW R0, ·ssHandle(SB)
MOVW ·goWaitsH(SB), R0
MOVW ·cSetEvent(SB), R1
BL (R1)
MOVW ·cWaitsH(SB), R0
MOVW $-1, R1
MOVW ·cWaitForSingleObject(SB), R2
BL (R2)
exit:
MOVW R4, R13 // free extra stack space
MOVM.IA.W (R13), [R4, R15] // pop {r4, pc}
...@@ -112,12 +112,14 @@ func Getpagesize() int { return 4096 } ...@@ -112,12 +112,14 @@ func Getpagesize() int { return 4096 }
// NewCallback converts a Go function to a function pointer conforming to the stdcall calling convention. // NewCallback converts a Go function to a function pointer conforming to the stdcall calling convention.
// This is useful when interoperating with Windows code requiring callbacks. // This is useful when interoperating with Windows code requiring callbacks.
// The argument is expected to be a function with with one uintptr-sized result. The function must not have arguments with size larger than the size of uintptr.
func NewCallback(fn interface{}) uintptr { func NewCallback(fn interface{}) uintptr {
return syscall.NewCallback(fn) return syscall.NewCallback(fn)
} }
// NewCallbackCDecl converts a Go function to a function pointer conforming to the cdecl calling convention. // NewCallbackCDecl converts a Go function to a function pointer conforming to the cdecl calling convention.
// This is useful when interoperating with Windows code requiring callbacks. // This is useful when interoperating with Windows code requiring callbacks.
// The argument is expected to be a function with with one uintptr-sized result. The function must not have arguments with size larger than the size of uintptr.
func NewCallbackCDecl(fn interface{}) uintptr { func NewCallbackCDecl(fn interface{}) uintptr {
return syscall.NewCallbackCDecl(fn) return syscall.NewCallbackCDecl(fn)
} }
...@@ -653,7 +655,7 @@ type RawSockaddr struct { ...@@ -653,7 +655,7 @@ type RawSockaddr struct {
type RawSockaddrAny struct { type RawSockaddrAny struct {
Addr RawSockaddr Addr RawSockaddr
Pad [96]int8 Pad [100]int8
} }
type Sockaddr interface { type Sockaddr interface {
...@@ -702,19 +704,69 @@ func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, int32, error) { ...@@ -702,19 +704,69 @@ func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, int32, error) {
return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil
} }
type RawSockaddrUnix struct {
Family uint16
Path [UNIX_PATH_MAX]int8
}
type SockaddrUnix struct { type SockaddrUnix struct {
Name string Name string
raw RawSockaddrUnix
} }
func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, int32, error) { func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, int32, error) {
// TODO(brainman): implement SockaddrUnix.sockaddr() name := sa.Name
return nil, 0, syscall.EWINDOWS n := len(name)
if n > len(sa.raw.Path) {
return nil, 0, syscall.EINVAL
}
if n == len(sa.raw.Path) && name[0] != '@' {
return nil, 0, syscall.EINVAL
}
sa.raw.Family = AF_UNIX
for i := 0; i < n; i++ {
sa.raw.Path[i] = int8(name[i])
}
// length is family (uint16), name, NUL.
sl := int32(2)
if n > 0 {
sl += int32(n) + 1
}
if sa.raw.Path[0] == '@' {
sa.raw.Path[0] = 0
// Don't count trailing NUL for abstract address.
sl--
}
return unsafe.Pointer(&sa.raw), sl, nil
} }
func (rsa *RawSockaddrAny) Sockaddr() (Sockaddr, error) { func (rsa *RawSockaddrAny) Sockaddr() (Sockaddr, error) {
switch rsa.Addr.Family { switch rsa.Addr.Family {
case AF_UNIX: case AF_UNIX:
return nil, syscall.EWINDOWS pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa))
sa := new(SockaddrUnix)
if pp.Path[0] == 0 {
// "Abstract" Unix domain socket.
// Rewrite leading NUL as @ for textual display.
// (This is the standard convention.)
// Not friendly to overwrite in place,
// but the callers below don't care.
pp.Path[0] = '@'
}
// Assume path ends at NUL.
// This is not technically the Linux semantics for
// abstract Unix domain sockets--they are supposed
// to be uninterpreted fixed-size binary blobs--but
// everyone uses this convention.
n := 0
for n < len(pp.Path) && pp.Path[n] != 0 {
n++
}
bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n]
sa.Name = string(bytes)
return sa, nil
case AF_INET: case AF_INET:
pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa))
......
...@@ -105,3 +105,9 @@ func ExampleLoadLibrary() { ...@@ -105,3 +105,9 @@ func ExampleLoadLibrary() {
build := uint16(r >> 16) build := uint16(r >> 16)
print("windows version ", major, ".", minor, " (Build ", build, ")\n") print("windows version ", major, ".", minor, " (Build ", build, ")\n")
} }
func TestTOKEN_ALL_ACCESS(t *testing.T) {
if windows.TOKEN_ALL_ACCESS != 0xF01FF {
t.Errorf("TOKEN_ALL_ACCESS = %x, want 0xF01FF", windows.TOKEN_ALL_ACCESS)
}
}
// Copyright 2018 The Go 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 windows
type WSAData struct {
Version uint16
HighVersion uint16
Description [WSADESCRIPTION_LEN + 1]byte
SystemStatus [WSASYS_STATUS_LEN + 1]byte
MaxSockets uint16
MaxUdpDg uint16
VendorInfo *byte
}
type Servent struct {
Name *byte
Aliases **byte
Port uint16
Proto *byte
}
// MACHINE GENERATED BY 'go generate' COMMAND; DO NOT EDIT // Code generated by 'go generate'; DO NOT EDIT.
package windows package windows
......
...@@ -131,40 +131,40 @@ ...@@ -131,40 +131,40 @@
"revisionTime": "2018-06-27T13:57:12Z" "revisionTime": "2018-06-27T13:57:12Z"
}, },
{ {
"checksumSHA1": "y0x0I9zDxnxn9nCxwP/MdPyq1E8=", "checksumSHA1": "s+lofQ+SCdhmy0cQp9FpdQncuuI=",
"path": "golang.org/x/sys/windows", "path": "golang.org/x/sys/windows",
"revision": "c11f84a56e43e20a78cee75a7c034031ecf57d1f", "revision": "90868a75fefd03942536221d7c0e2f84ec62a668",
"revisionTime": "2018-05-25T13:55:20Z" "revisionTime": "2018-08-01T20:46:00Z"
}, },
{ {
"checksumSHA1": "BnZkq/3Ejb7961bDhybRraW6jzI=", "checksumSHA1": "yEg3f1MGwuyDh5NrNEGkWKlTyqY=",
"path": "golang.org/x/sys/windows/registry", "path": "golang.org/x/sys/windows/registry",
"revision": "c11f84a56e43e20a78cee75a7c034031ecf57d1f", "revision": "90868a75fefd03942536221d7c0e2f84ec62a668",
"revisionTime": "2018-05-25T13:55:20Z" "revisionTime": "2018-08-01T20:46:00Z"
}, },
{ {
"checksumSHA1": "dQbFeoiAxfB3WFFVcAdeSwSgeDk=", "checksumSHA1": "ZDwqsuoZqQq/XMQ0R0dJ4oK41lU=",
"path": "golang.org/x/sys/windows/svc", "path": "golang.org/x/sys/windows/svc",
"revision": "c11f84a56e43e20a78cee75a7c034031ecf57d1f", "revision": "90868a75fefd03942536221d7c0e2f84ec62a668",
"revisionTime": "2018-05-25T13:55:20Z" "revisionTime": "2018-08-01T20:46:00Z"
}, },
{ {
"checksumSHA1": "e9KJPWrdqg5PMkbE2w60Io8rY4M=", "checksumSHA1": "e9KJPWrdqg5PMkbE2w60Io8rY4M=",
"path": "golang.org/x/sys/windows/svc/debug", "path": "golang.org/x/sys/windows/svc/debug",
"revision": "c11f84a56e43e20a78cee75a7c034031ecf57d1f", "revision": "90868a75fefd03942536221d7c0e2f84ec62a668",
"revisionTime": "2018-05-25T13:55:20Z" "revisionTime": "2018-08-01T20:46:00Z"
}, },
{ {
"checksumSHA1": "dz53pQfqAnXG8HdJj+nazXN9YRw=", "checksumSHA1": "dz53pQfqAnXG8HdJj+nazXN9YRw=",
"path": "golang.org/x/sys/windows/svc/eventlog", "path": "golang.org/x/sys/windows/svc/eventlog",
"revision": "c11f84a56e43e20a78cee75a7c034031ecf57d1f", "revision": "90868a75fefd03942536221d7c0e2f84ec62a668",
"revisionTime": "2018-05-25T13:55:20Z" "revisionTime": "2018-08-01T20:46:00Z"
}, },
{ {
"checksumSHA1": "wz+0tf0Z7cVBaz/35P1m1cAiI7k=", "checksumSHA1": "vV6Mr/b+1GaHiHLnq2zEejQJVec=",
"path": "golang.org/x/sys/windows/svc/mgr", "path": "golang.org/x/sys/windows/svc/mgr",
"revision": "c11f84a56e43e20a78cee75a7c034031ecf57d1f", "revision": "90868a75fefd03942536221d7c0e2f84ec62a668",
"revisionTime": "2018-05-25T13:55:20Z" "revisionTime": "2018-08-01T20:46:00Z"
} }
], ],
"rootPath": "/cmd" "rootPath": "/cmd"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment