summaryrefslogtreecommitdiff
path: root/src/pkg/syscall/syscall_windows.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/pkg/syscall/syscall_windows.go')
-rw-r--r--src/pkg/syscall/syscall_windows.go235
1 files changed, 99 insertions, 136 deletions
diff --git a/src/pkg/syscall/syscall_windows.go b/src/pkg/syscall/syscall_windows.go
index 762ed53db..0cd89d426 100644
--- a/src/pkg/syscall/syscall_windows.go
+++ b/src/pkg/syscall/syscall_windows.go
@@ -106,57 +106,59 @@ func NewCallback(fn interface{}) uintptr
//sys GetLastError() (lasterrno int)
//sys LoadLibrary(libname string) (handle uint32, errno int) = LoadLibraryW
-//sys FreeLibrary(handle uint32) (ok bool, errno int)
+//sys FreeLibrary(handle uint32) (errno int)
//sys GetProcAddress(module uint32, procname string) (proc uint32, errno int)
//sys GetVersion() (ver uint32, errno int)
//sys FormatMessage(flags uint32, msgsrc uint32, msgid uint32, langid uint32, buf []uint16, args *byte) (n uint32, errno int) = FormatMessageW
//sys ExitProcess(exitcode uint32)
-//sys CreateFile(name *uint16, access uint32, mode uint32, sa *byte, createmode uint32, attrs uint32, templatefile int32) (handle int32, errno int) [failretval==-1] = CreateFileW
-//sys ReadFile(handle int32, buf []byte, done *uint32, overlapped *Overlapped) (ok bool, errno int)
-//sys WriteFile(handle int32, buf []byte, done *uint32, overlapped *Overlapped) (ok bool, errno int)
+//sys CreateFile(name *uint16, access uint32, mode uint32, sa *SecurityAttributes, createmode uint32, attrs uint32, templatefile int32) (handle int32, errno int) [failretval==-1] = CreateFileW
+//sys ReadFile(handle int32, buf []byte, done *uint32, overlapped *Overlapped) (errno int)
+//sys WriteFile(handle int32, buf []byte, done *uint32, overlapped *Overlapped) (errno int)
//sys SetFilePointer(handle int32, lowoffset int32, highoffsetptr *int32, whence uint32) (newlowoffset uint32, errno int) [failretval==0xffffffff]
-//sys CloseHandle(handle int32) (ok bool, errno int)
+//sys CloseHandle(handle int32) (errno int)
//sys GetStdHandle(stdhandle int32) (handle int32, errno int) [failretval==-1]
//sys FindFirstFile(name *uint16, data *Win32finddata) (handle int32, errno int) [failretval==-1] = FindFirstFileW
-//sys FindNextFile(handle int32, data *Win32finddata) (ok bool, errno int) = FindNextFileW
-//sys FindClose(handle int32) (ok bool, errno int)
-//sys GetFileInformationByHandle(handle int32, data *ByHandleFileInformation) (ok bool, errno int)
+//sys FindNextFile(handle int32, data *Win32finddata) (errno int) = FindNextFileW
+//sys FindClose(handle int32) (errno int)
+//sys GetFileInformationByHandle(handle int32, data *ByHandleFileInformation) (errno int)
//sys GetCurrentDirectory(buflen uint32, buf *uint16) (n uint32, errno int) = GetCurrentDirectoryW
-//sys SetCurrentDirectory(path *uint16) (ok bool, errno int) = SetCurrentDirectoryW
-//sys CreateDirectory(path *uint16, sa *byte) (ok bool, errno int) = CreateDirectoryW
-//sys RemoveDirectory(path *uint16) (ok bool, errno int) = RemoveDirectoryW
-//sys DeleteFile(path *uint16) (ok bool, errno int) = DeleteFileW
-//sys MoveFile(from *uint16, to *uint16) (ok bool, errno int) = MoveFileW
-//sys GetComputerName(buf *uint16, n *uint32) (ok bool, errno int) = GetComputerNameW
-//sys SetEndOfFile(handle int32) (ok bool, errno int)
+//sys SetCurrentDirectory(path *uint16) (errno int) = SetCurrentDirectoryW
+//sys CreateDirectory(path *uint16, sa *SecurityAttributes) (errno int) = CreateDirectoryW
+//sys RemoveDirectory(path *uint16) (errno int) = RemoveDirectoryW
+//sys DeleteFile(path *uint16) (errno int) = DeleteFileW
+//sys MoveFile(from *uint16, to *uint16) (errno int) = MoveFileW
+//sys GetComputerName(buf *uint16, n *uint32) (errno int) = GetComputerNameW
+//sys SetEndOfFile(handle int32) (errno int)
//sys GetSystemTimeAsFileTime(time *Filetime)
//sys sleep(msec uint32) = Sleep
//sys GetTimeZoneInformation(tzi *Timezoneinformation) (rc uint32, errno int) [failretval==0xffffffff]
//sys CreateIoCompletionPort(filehandle int32, cphandle int32, key uint32, threadcnt uint32) (handle int32, errno int)
-//sys GetQueuedCompletionStatus(cphandle int32, qty *uint32, key *uint32, overlapped **Overlapped, timeout uint32) (ok bool, errno int)
-//sys CancelIo(s uint32) (ok bool, errno int)
-//sys CreateProcess(appName *int16, commandLine *uint16, procSecurity *int16, threadSecurity *int16, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (ok bool, errno int) = CreateProcessW
-//sys GetStartupInfo(startupInfo *StartupInfo) (ok bool, errno int) = GetStartupInfoW
+//sys GetQueuedCompletionStatus(cphandle int32, qty *uint32, key *uint32, overlapped **Overlapped, timeout uint32) (errno int)
+//sys CancelIo(s uint32) (errno int)
+//sys CreateProcess(appName *int16, commandLine *uint16, procSecurity *int16, threadSecurity *int16, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (errno int) = CreateProcessW
+//sys OpenProcess(da uint32, inheritHandle bool, pid uint32) (handle uint32, errno int)
+//sys GetExitCodeProcess(handle uint32, exitcode *uint32) (errno int)
+//sys GetStartupInfo(startupInfo *StartupInfo) (errno int) = GetStartupInfoW
//sys GetCurrentProcess() (pseudoHandle int32, errno int)
-//sys DuplicateHandle(hSourceProcessHandle int32, hSourceHandle int32, hTargetProcessHandle int32, lpTargetHandle *int32, dwDesiredAccess uint32, bInheritHandle bool, dwOptions uint32) (ok bool, errno int)
+//sys DuplicateHandle(hSourceProcessHandle int32, hSourceHandle int32, hTargetProcessHandle int32, lpTargetHandle *int32, dwDesiredAccess uint32, bInheritHandle bool, dwOptions uint32) (errno int)
//sys WaitForSingleObject(handle int32, waitMilliseconds uint32) (event uint32, errno int) [failretval==0xffffffff]
//sys GetTempPath(buflen uint32, buf *uint16) (n uint32, errno int) = GetTempPathW
-//sys CreatePipe(readhandle *uint32, writehandle *uint32, lpsa *byte, size uint32) (ok bool, errno int)
+//sys CreatePipe(readhandle *uint32, writehandle *uint32, sa *SecurityAttributes, size uint32) (errno int)
//sys GetFileType(filehandle uint32) (n uint32, errno int)
-//sys CryptAcquireContext(provhandle *uint32, container *uint16, provider *uint16, provtype uint32, flags uint32) (ok bool, errno int) = advapi32.CryptAcquireContextW
-//sys CryptReleaseContext(provhandle uint32, flags uint32) (ok bool, errno int) = advapi32.CryptReleaseContext
-//sys CryptGenRandom(provhandle uint32, buflen uint32, buf *byte) (ok bool, errno int) = advapi32.CryptGenRandom
-//sys OpenProcess(da uint32,b int, pid uint32) (handle uint32, errno int)
-//sys GetExitCodeProcess(h uint32, c *uint32) (ok bool, errno int)
+//sys CryptAcquireContext(provhandle *uint32, container *uint16, provider *uint16, provtype uint32, flags uint32) (errno int) = advapi32.CryptAcquireContextW
+//sys CryptReleaseContext(provhandle uint32, flags uint32) (errno int) = advapi32.CryptReleaseContext
+//sys CryptGenRandom(provhandle uint32, buflen uint32, buf *byte) (errno int) = advapi32.CryptGenRandom
//sys GetEnvironmentStrings() (envs *uint16, errno int) [failretval==nil] = kernel32.GetEnvironmentStringsW
-//sys FreeEnvironmentStrings(envs *uint16) (ok bool, errno int) = kernel32.FreeEnvironmentStringsW
+//sys FreeEnvironmentStrings(envs *uint16) (errno int) = kernel32.FreeEnvironmentStringsW
//sys GetEnvironmentVariable(name *uint16, buffer *uint16, size uint32) (n uint32, errno int) = kernel32.GetEnvironmentVariableW
-//sys SetEnvironmentVariable(name *uint16, value *uint16) (ok bool, errno int) = kernel32.SetEnvironmentVariableW
-//sys SetFileTime(handle int32, ctime *Filetime, atime *Filetime, wtime *Filetime) (ok bool, errno int)
+//sys SetEnvironmentVariable(name *uint16, value *uint16) (errno int) = kernel32.SetEnvironmentVariableW
+//sys SetFileTime(handle int32, ctime *Filetime, atime *Filetime, wtime *Filetime) (errno int)
//sys GetFileAttributes(name *uint16) (attrs uint32, errno int) [failretval==INVALID_FILE_ATTRIBUTES] = kernel32.GetFileAttributesW
//sys GetCommandLine() (cmd *uint16) = kernel32.GetCommandLineW
//sys CommandLineToArgv(cmd *uint16, argc *int32) (argv *[8192]*[8192]uint16, errno int) [failretval==nil] = shell32.CommandLineToArgvW
//sys LocalFree(hmem uint32) (handle uint32, errno int) [failretval!=0]
+//sys SetHandleInformation(handle int32, mask uint32, flags uint32) (errno int)
+//sys FlushFileBuffers(handle int32) (errno int)
// syscall interface implementation for other packages
@@ -181,6 +183,13 @@ func Errstr(errno int) string {
func Exit(code int) { ExitProcess(uint32(code)) }
+func makeInheritSa() *SecurityAttributes {
+ var sa SecurityAttributes
+ sa.Length = uint32(unsafe.Sizeof(sa))
+ sa.InheritHandle = 1
+ return &sa
+}
+
func Open(path string, mode int, perm uint32) (fd int, errno int) {
if len(path) == 0 {
return -1, ERROR_FILE_NOT_FOUND
@@ -202,6 +211,10 @@ func Open(path string, mode int, perm uint32) (fd int, errno int) {
access |= FILE_APPEND_DATA
}
sharemode := uint32(FILE_SHARE_READ | FILE_SHARE_WRITE)
+ var sa *SecurityAttributes
+ if mode&O_CLOEXEC == 0 {
+ sa = makeInheritSa()
+ }
var createmode uint32
switch {
case mode&O_CREAT != 0:
@@ -215,13 +228,14 @@ func Open(path string, mode int, perm uint32) (fd int, errno int) {
default:
createmode = OPEN_EXISTING
}
- h, e := CreateFile(StringToUTF16Ptr(path), access, sharemode, nil, createmode, FILE_ATTRIBUTE_NORMAL, 0)
+ h, e := CreateFile(StringToUTF16Ptr(path), access, sharemode, sa, createmode, FILE_ATTRIBUTE_NORMAL, 0)
return int(h), int(e)
}
func Read(fd int, p []byte) (n int, errno int) {
var done uint32
- if ok, e := ReadFile(int32(fd), p, &done, nil); !ok {
+ e := ReadFile(int32(fd), p, &done, nil)
+ if e != 0 {
if e == ERROR_BROKEN_PIPE {
// NOTE(brainman): work around ERROR_BROKEN_PIPE is returned on reading EOF from stdin
return 0, 0
@@ -245,7 +259,8 @@ func Pread(fd int, p []byte, offset int64) (n int, errno int) {
o.OffsetHigh = uint32(offset >> 32)
o.Offset = uint32(offset)
var done uint32
- if ok, e := ReadFile(int32(fd), p, &done, &o); !ok {
+ e = ReadFile(int32(fd), p, &done, &o)
+ if e != 0 {
return 0, e
}
return int(done), 0
@@ -253,7 +268,8 @@ func Pread(fd int, p []byte, offset int64) (n int, errno int) {
func Write(fd int, p []byte) (n int, errno int) {
var done uint32
- if ok, e := WriteFile(int32(fd), p, &done, nil); !ok {
+ e := WriteFile(int32(fd), p, &done, nil)
+ if e != 0 {
return 0, e
}
return int(done), 0
@@ -269,7 +285,8 @@ func Pwrite(fd int, p []byte, offset int64) (n int, errno int) {
o.OffsetHigh = uint32(offset >> 32)
o.Offset = uint32(offset)
var done uint32
- if ok, e := WriteFile(int32(fd), p, &done, &o); !ok {
+ e = WriteFile(int32(fd), p, &done, &o)
+ if e != 0 {
return 0, e
}
return int(done), 0
@@ -300,10 +317,7 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, errno int) {
}
func Close(fd int) (errno int) {
- if ok, e := CloseHandle(int32(fd)); !ok {
- return e
- }
- return 0
+ return CloseHandle(int32(fd))
}
var (
@@ -362,46 +376,32 @@ func Getwd() (wd string, errno int) {
}
func Chdir(path string) (errno int) {
- if ok, e := SetCurrentDirectory(&StringToUTF16(path)[0]); !ok {
- return e
- }
- return 0
+ return SetCurrentDirectory(&StringToUTF16(path)[0])
}
func Mkdir(path string, mode uint32) (errno int) {
- if ok, e := CreateDirectory(&StringToUTF16(path)[0], nil); !ok {
- return e
- }
- return 0
+ return CreateDirectory(&StringToUTF16(path)[0], nil)
}
func Rmdir(path string) (errno int) {
- if ok, e := RemoveDirectory(&StringToUTF16(path)[0]); !ok {
- return e
- }
- return 0
+ return RemoveDirectory(&StringToUTF16(path)[0])
}
func Unlink(path string) (errno int) {
- if ok, e := DeleteFile(&StringToUTF16(path)[0]); !ok {
- return e
- }
- return 0
+ return DeleteFile(&StringToUTF16(path)[0])
}
func Rename(oldpath, newpath string) (errno int) {
from := &StringToUTF16(oldpath)[0]
to := &StringToUTF16(newpath)[0]
- if ok, e := MoveFile(from, to); !ok {
- return e
- }
- return 0
+ return MoveFile(from, to)
}
func ComputerName() (name string, errno int) {
var n uint32 = MAX_COMPUTERNAME_LENGTH + 1
b := make([]uint16, n)
- if ok, e := GetComputerName(&b[0], &n); !ok {
+ e := GetComputerName(&b[0], &n)
+ if e != 0 {
return "", e
}
return string(utf16.Decode(b[0:n])), 0
@@ -413,10 +413,12 @@ func Ftruncate(fd int, length int64) (errno int) {
return e
}
defer Seek(fd, curoffset, 0)
- if _, e := Seek(fd, length, 0); e != 0 {
+ _, e = Seek(fd, length, 0)
+ if e != 0 {
return e
}
- if _, e := SetEndOfFile(int32(fd)); e != 0 {
+ e = SetEndOfFile(int32(fd))
+ if e != 0 {
return e
}
return 0
@@ -439,8 +441,9 @@ func Pipe(p []int) (errno int) {
return EINVAL
}
var r, w uint32
- if ok, errno := CreatePipe(&r, &w, nil, 0); !ok {
- return errno
+ e := CreatePipe(&r, &w, makeInheritSa(), 0)
+ if e != 0 {
+ return e
}
p[0] = int(r)
p[1] = int(w)
@@ -460,10 +463,11 @@ func Utimes(path string, tv []Timeval) (errno int) {
defer Close(int(h))
a := NsecToFiletime(tv[0].Nanoseconds())
w := NsecToFiletime(tv[1].Nanoseconds())
- if ok, e := SetFileTime(h, nil, &a, &w); !ok {
- return e
- }
- return 0
+ return SetFileTime(h, nil, &a, &w)
+}
+
+func Fsync(fd int) (errno int) {
+ return FlushFileBuffers(int32(fd))
}
// net api calls
@@ -479,7 +483,7 @@ func Utimes(path string, tv []Timeval) (errno int) {
//sys listen(s int32, backlog int32) (errno int) [failretval==-1] = wsock32.listen
//sys shutdown(s int32, how int32) (errno int) [failretval==-1] = wsock32.shutdown
//sys Closesocket(s int32) (errno int) [failretval==-1] = wsock32.closesocket
-//sys AcceptEx(ls uint32, as uint32, buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, recvd *uint32, overlapped *Overlapped) (ok bool, errno int) = wsock32.AcceptEx
+//sys AcceptEx(ls uint32, as uint32, buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, recvd *uint32, overlapped *Overlapped) (errno int) = wsock32.AcceptEx
//sys GetAcceptExSockaddrs(buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, lrsa **RawSockaddrAny, lrsalen *int32, rrsa **RawSockaddrAny, rrsalen *int32) = wsock32.GetAcceptExSockaddrs
//sys WSARecv(s uint32, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, overlapped *Overlapped, croutine *byte) (errno int) [failretval==-1] = ws2_32.WSARecv
//sys WSASend(s uint32, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, overlapped *Overlapped, croutine *byte) (errno int) [failretval==-1] = ws2_32.WSASend
@@ -637,7 +641,7 @@ func AcceptIOCP(iocpfd, fd int, o *Overlapped) (attrs *byte, errno int) {
attrs = (*byte)(unsafe.Pointer(&rsa[0]))
alen := uint32(unsafe.Sizeof(rsa[0]))
var done uint32
- _, errno = AcceptEx(uint32(iocpfd), uint32(fd), attrs, 0, alen, alen, &done, o)
+ errno = AcceptEx(uint32(iocpfd), uint32(fd), attrs, 0, alen, alen, &done, o)
return
}
@@ -660,6 +664,32 @@ func WSASendto(s uint32, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32
return
}
+// Invented structures to support what package os expects.
+type Rusage struct{}
+
+type WaitStatus struct {
+ Status uint32
+ ExitCode uint32
+}
+
+func (w WaitStatus) Exited() bool { return true }
+
+func (w WaitStatus) ExitStatus() int { return int(w.ExitCode) }
+
+func (w WaitStatus) Signal() int { return -1 }
+
+func (w WaitStatus) CoreDump() bool { return false }
+
+func (w WaitStatus) Stopped() bool { return false }
+
+func (w WaitStatus) Continued() bool { return false }
+
+func (w WaitStatus) StopSignal() int { return -1 }
+
+func (w WaitStatus) Signaled() bool { return true }
+
+func (w WaitStatus) TrapCause() int { return -1 }
+
// TODO(brainman): fix all needed for net
func Accept(fd int) (nfd int, sa Sockaddr, errno int) { return 0, nil, EWINDOWS }
@@ -694,9 +724,6 @@ func Chown(path string, uid int, gid int) (errno int) { return EWINDOWS }
func Lchown(path string, uid int, gid int) (errno int) { return EWINDOWS }
func Fchown(fd int, uid int, gid int) (errno int) { return EWINDOWS }
-// TODO(brainman): use FlushFileBuffers Windows api to implement Fsync.
-func Fsync(fd int) (errno int) { return EWINDOWS }
-
func Getuid() (uid int) { return -1 }
func Geteuid() (euid int) { return -1 }
func Getgid() (gid int) { return -1 }
@@ -723,67 +750,3 @@ const (
SYS_EXIT
SYS_READ
)
-
-type Rusage struct {
- Utime Timeval
- Stime Timeval
- Maxrss int32
- Ixrss int32
- Idrss int32
- Isrss int32
- Minflt int32
- Majflt int32
- Nswap int32
- Inblock int32
- Oublock int32
- Msgsnd int32
- Msgrcv int32
- Nsignals int32
- Nvcsw int32
- Nivcsw int32
-}
-
-type WaitStatus struct {
- Status uint32
- ExitCode uint32
-}
-
-func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, errno int) {
- const da = STANDARD_RIGHTS_READ | PROCESS_QUERY_INFORMATION | SYNCHRONIZE
- handle, errno := OpenProcess(da, 0, uint32(pid))
- if errno != 0 {
- return 0, errno
- }
- defer CloseHandle(int32(handle))
- e, errno := WaitForSingleObject(int32(handle), INFINITE)
- var c uint32
- if ok, errno := GetExitCodeProcess(handle, &c); !ok {
- return 0, errno
- }
- *wstatus = WaitStatus{e, c}
- return pid, 0
-}
-
-
-func (w WaitStatus) Exited() bool { return w.Status == WAIT_OBJECT_0 }
-
-func (w WaitStatus) ExitStatus() int {
- if w.Status == WAIT_OBJECT_0 {
- return int(w.ExitCode)
- }
- return -1
-}
-
-func (WaitStatus) Signal() int { return -1 }
-
-func (WaitStatus) CoreDump() bool { return false }
-
-func (WaitStatus) Stopped() bool { return false }
-
-func (WaitStatus) Continued() bool { return false }
-
-func (WaitStatus) StopSignal() int { return -1 }
-
-func (w WaitStatus) Signaled() bool { return w.Status == WAIT_OBJECT_0 }
-
-func (WaitStatus) TrapCause() int { return -1 }