diff options
Diffstat (limited to 'src/pkg/syscall/syscall_mingw.go')
| -rw-r--r-- | src/pkg/syscall/syscall_mingw.go | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/src/pkg/syscall/syscall_mingw.go b/src/pkg/syscall/syscall_mingw.go new file mode 100644 index 000000000..b653a5a20 --- /dev/null +++ b/src/pkg/syscall/syscall_mingw.go @@ -0,0 +1,163 @@ +// Copyright 2009 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. + +// Windows system calls. + +package syscall + +import "unsafe" + +const OS = "mingw" + +/* + +small demo to detect version of windows you are running: + +package main + +import ( + "syscall" +) + +func print_version(v uint32) { + major := byte(v) + minor := uint8(v >> 8) + build := uint16(v >> 16) + print("windows version ", major, ".", minor, " (Build ", build, ")\n") +} + +func main() { + h, err := syscall.LoadLibrary("kernel32.dll") + if err != 0 { + panic("failed to LoadLibrary #", err, "\n") + } + defer syscall.FreeLibrary(h) + proc, err := syscall.GetProcAddress(h, "GetVersion") + if err != 0 { + panic("could not GetProcAddress #", err, "\n") + } + r, _, e := syscall.Syscall(uintptr(proc), 0, 0, 0) + err = int(e) + if err != 0 { + panic("GetVersion failed #", err, "\n") + } + print_version(uint32(r)) +} + +*/ + +//sys GetLastError() (lasterrno int) + +// TODO(brainman): probably should use LoadLibraryW here instead +//sys LoadLibraryA(libname string) (handle Module, errno int) + +func LoadLibrary(libname string) (handle Module, errno int) { + h, e := LoadLibraryA(libname) + if int(h) != 0 { + return h, 0 + } + return h, e +} + +// TODO(brainman): should handle errors like in LoadLibrary, otherwise will be returning 'old' errors +//sys FreeLibrary(handle Module) (ok Bool, errno int) +//sys GetProcAddress(module Module, procname string) (proc uint32, errno int) +//sys GetVersion() (ver uint32, errno int) + +// dll helpers + +// implemented in ../pkg/runtime/mingw/syscall.cgo +func loadlibraryex(filename uintptr) (handle uint32) +func getprocaddress(handle uint32, procname uintptr) (proc uintptr) + +func loadDll(fname string) Module { + m := loadlibraryex(uintptr(unsafe.Pointer(StringBytePtr(fname)))) + if m == 0 { + panic("syscall: could not LoadLibraryEx ", fname) + } + return Module(m) +} + +func getSysProcAddr(m Module, pname string) uintptr { + p := getprocaddress(uint32(m), uintptr(unsafe.Pointer(StringBytePtr(pname)))) + if p == 0 { + panic("syscall: could not GetProcAddress for ", pname) + } + return p +} + +// TODO(brainman): fix all this meaningless code, it is here to compile exec.go + +func Pipe(p []int) (errno int) { return EMINGW } + +//sys Close(fd int) (errno int) +//sys read(fd int, buf *byte, nbuf int) (n int, errno int) + +func fcntl(fd, cmd, arg int) (val int, errno int) { + return 0, EMINGW +} + +const ( + F_SETFD = 1 + iota + FD_CLOEXEC + F_GETFL + F_SETFL + O_NONBLOCK + SYS_FORK + SYS_PTRACE + SYS_CHDIR + SYS_DUP2 + SYS_FCNTL + SYS_EXECVE + PTRACE_TRACEME + SYS_CLOSE + SYS_WRITE + SYS_EXIT + SYS_READ + EPIPE + EINTR +) + +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 +} + +func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, errno int) { + return 0, EMINGW +} + +type WaitStatus uint32 + +func (WaitStatus) Exited() bool { return false } + +func (WaitStatus) ExitStatus() int { 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 (WaitStatus) Signaled() bool { return false } + +func (WaitStatus) TrapCause() int { return -1 } |
