]> Cypherpunks repositories - gostls13.git/commitdiff
internal/syscall/windows: add LockFileEx and UnlockFileEx for use in cmd/go
authorBryan C. Mills <bcmills@google.com>
Tue, 16 Oct 2018 20:05:51 +0000 (16:05 -0400)
committerBryan C. Mills <bcmills@google.com>
Fri, 2 Nov 2018 15:56:35 +0000 (15:56 +0000)
Updates #26794

Change-Id: Ic1d3078176721f3d2e5d8188c234383037babbaf
Reviewed-on: https://go-review.googlesource.com/c/145177
Run-TryBot: Bryan C. Mills <bcmills@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
src/internal/syscall/windows/syscall_windows.go
src/internal/syscall/windows/zsyscall_windows.go

index 66fe9324c0ae1d5e58f4d2d4a00d287a68f45b33..121132f6f7326b90cc12c6078995d159afb1dca8 100644 (file)
@@ -12,7 +12,11 @@ import (
 
 const (
        ERROR_SHARING_VIOLATION      syscall.Errno = 32
+       ERROR_LOCK_VIOLATION         syscall.Errno = 33
+       ERROR_NOT_SUPPORTED          syscall.Errno = 50
+       ERROR_CALL_NOT_IMPLEMENTED   syscall.Errno = 120
        ERROR_INVALID_NAME           syscall.Errno = 123
+       ERROR_LOCK_FAILED            syscall.Errno = 167
        ERROR_NO_UNICODE_TRANSLATION syscall.Errno = 1113
 )
 
@@ -255,6 +259,14 @@ func Rename(oldpath, newpath string) error {
        return MoveFileEx(from, to, MOVEFILE_REPLACE_EXISTING)
 }
 
+//sys LockFileEx(file syscall.Handle, flags uint32, reserved uint32, bytesLow uint32, bytesHigh uint32, overlapped *syscall.Overlapped) (err error) = kernel32.LockFileEx
+//sys UnlockFileEx(file syscall.Handle, reserved uint32, bytesLow uint32, bytesHigh uint32, overlapped *syscall.Overlapped) (err error) = kernel32.UnlockFileEx
+
+const (
+       LOCKFILE_FAIL_IMMEDIATELY = 0x00000001
+       LOCKFILE_EXCLUSIVE_LOCK   = 0x00000002
+)
+
 const MB_ERR_INVALID_CHARS = 8
 
 //sys  GetACP() (acp uint32) = kernel32.GetACP
index 2212697b1b092e1c41dd86537497370e47acea22..9527a370a4e011aff92e6638311ca757110a57e3 100644 (file)
@@ -49,6 +49,8 @@ var (
        procMoveFileExW                  = modkernel32.NewProc("MoveFileExW")
        procGetModuleFileNameW           = modkernel32.NewProc("GetModuleFileNameW")
        procWSASocketW                   = modws2_32.NewProc("WSASocketW")
+       procLockFileEx                   = modkernel32.NewProc("LockFileEx")
+       procUnlockFileEx                 = modkernel32.NewProc("UnlockFileEx")
        procGetACP                       = modkernel32.NewProc("GetACP")
        procGetConsoleCP                 = modkernel32.NewProc("GetConsoleCP")
        procMultiByteToWideChar          = modkernel32.NewProc("MultiByteToWideChar")
@@ -127,6 +129,30 @@ func WSASocket(af int32, typ int32, protocol int32, protinfo *syscall.WSAProtoco
        return
 }
 
+func LockFileEx(file syscall.Handle, flags uint32, reserved uint32, bytesLow uint32, bytesHigh uint32, overlapped *syscall.Overlapped) (err error) {
+       r1, _, e1 := syscall.Syscall6(procLockFileEx.Addr(), 6, uintptr(file), uintptr(flags), uintptr(reserved), uintptr(bytesLow), uintptr(bytesHigh), uintptr(unsafe.Pointer(overlapped)))
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = errnoErr(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
+func UnlockFileEx(file syscall.Handle, reserved uint32, bytesLow uint32, bytesHigh uint32, overlapped *syscall.Overlapped) (err error) {
+       r1, _, e1 := syscall.Syscall6(procUnlockFileEx.Addr(), 5, uintptr(file), uintptr(reserved), uintptr(bytesLow), uintptr(bytesHigh), uintptr(unsafe.Pointer(overlapped)), 0)
+       if r1 == 0 {
+               if e1 != 0 {
+                       err = errnoErr(e1)
+               } else {
+                       err = syscall.EINVAL
+               }
+       }
+       return
+}
+
 func GetACP() (acp uint32) {
        r0, _, _ := syscall.Syscall(procGetACP.Addr(), 0, 0, 0, 0)
        acp = uint32(r0)