summaryrefslogtreecommitdiff
path: root/src/pkg/syscall/syscall_mingw.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/pkg/syscall/syscall_mingw.go')
-rw-r--r--src/pkg/syscall/syscall_mingw.go163
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 }