LEFT | RIGHT |
1 // Copyright 2009 The Go Authors. All rights reserved. | 1 // Copyright 2009 The Go Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style | 2 // Use of this source code is governed by a BSD-style |
3 // license that can be found in the LICENSE file. | 3 // license that can be found in the LICENSE file. |
4 | 4 |
5 // Windows system calls. | 5 // Windows system calls. |
6 | 6 |
7 package syscall | 7 package syscall |
8 | 8 |
9 import ( | 9 import ( |
10 "unsafe" | 10 "unsafe" |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 //sys GetFileInformationByHandle(handle int32, data *ByHandleFileInformation)
(ok bool, errno int) | 121 //sys GetFileInformationByHandle(handle int32, data *ByHandleFileInformation)
(ok bool, errno int) |
122 //sys GetCurrentDirectory(buflen uint32, buf *uint16) (n uint32, errno int) =
GetCurrentDirectoryW | 122 //sys GetCurrentDirectory(buflen uint32, buf *uint16) (n uint32, errno int) =
GetCurrentDirectoryW |
123 //sys SetCurrentDirectory(path *uint16) (ok bool, errno int) = SetCurrentDirec
toryW | 123 //sys SetCurrentDirectory(path *uint16) (ok bool, errno int) = SetCurrentDirec
toryW |
124 //sys CreateDirectory(path *uint16, sa *byte) (ok bool, errno int) = CreateDir
ectoryW | 124 //sys CreateDirectory(path *uint16, sa *byte) (ok bool, errno int) = CreateDir
ectoryW |
125 //sys RemoveDirectory(path *uint16) (ok bool, errno int) = RemoveDirectoryW | 125 //sys RemoveDirectory(path *uint16) (ok bool, errno int) = RemoveDirectoryW |
126 //sys DeleteFile(path *uint16) (ok bool, errno int) = DeleteFileW | 126 //sys DeleteFile(path *uint16) (ok bool, errno int) = DeleteFileW |
127 //sys MoveFile(from *uint16, to *uint16) (ok bool, errno int) = MoveFileW | 127 //sys MoveFile(from *uint16, to *uint16) (ok bool, errno int) = MoveFileW |
128 //sys GetComputerName(buf *uint16, n *uint32) (ok bool, errno int) = GetComput
erNameW | 128 //sys GetComputerName(buf *uint16, n *uint32) (ok bool, errno int) = GetComput
erNameW |
129 //sys SetEndOfFile(handle int32) (ok bool, errno int) | 129 //sys SetEndOfFile(handle int32) (ok bool, errno int) |
130 //sys GetSystemTimeAsFileTime(time *Filetime) | 130 //sys GetSystemTimeAsFileTime(time *Filetime) |
131 //sys sleep(msec uint32) = Sleep | 131 //sys» sleep(msec uint32) = Sleep |
| 132 //sys» GetTimeZoneInformation(tzi *Timezoneinformation) (rc uint32, errno int)
[failretval=0xffffffff] |
| 133 //sys» CreateIoCompletionPort(filehandle int32, cphandle int32, key uint32, thr
eadcnt uint32) (handle int32, errno int) |
| 134 //sys» GetQueuedCompletionStatus(cphandle int32, qty *uint32, key *uint32, over
lapped **Overlapped, timeout uint32) (ok bool, errno int) |
132 //sys CreateProcess(appName *int16, commandLine *uint16, procSecurity *int16,
threadSecurity *int16, inheritHandles bool, creationFlags uint32, env *uint16, c
urrentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (
ok bool, errno int) = CreateProcessW | 135 //sys CreateProcess(appName *int16, commandLine *uint16, procSecurity *int16,
threadSecurity *int16, inheritHandles bool, creationFlags uint32, env *uint16, c
urrentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (
ok bool, errno int) = CreateProcessW |
133 //sys GetStartupInfo(startupInfo *StartupInfo) (ok bool, errno int) = GetStar
tupInfoW | 136 //sys GetStartupInfo(startupInfo *StartupInfo) (ok bool, errno int) = GetStar
tupInfoW |
| 137 //sys GetCurrentProcess() (pseudoHandle int32, errno int) |
| 138 //sys DuplicateHandle(hSourceProcessHandle int32, hSourceHandle int32, hTarget
ProcessHandle int32, lpTargetHandle *int32, dwDesiredAccess uint32, bInheritHand
le bool, dwOptions uint32) (ok bool, errno int) |
134 //sys WaitForSingleObject(handle int32, waitMilliseconds uint32) (event uint32
, errno int) [failretval=0xffffffff] | 139 //sys WaitForSingleObject(handle int32, waitMilliseconds uint32) (event uint32
, errno int) [failretval=0xffffffff] |
| 140 //sys GetTempPath(buflen uint32, buf *uint16) (n uint32, errno int) = GetTempP
athW |
| 141 //sys CryptAcquireContext(provhandle *uint32, container *uint16, provider *uin
t16, provtype uint32, flags uint32) (ok bool, errno int) = advapi32.CryptAcquire
ContextW |
| 142 //sys CryptReleaseContext(provhandle uint32, flags uint32) (ok bool, errno int
) = advapi32.CryptReleaseContext |
| 143 //sys CryptGenRandom(provhandle uint32, buflen uint32, buf *byte) (ok bool, er
rno int) = advapi32.CryptGenRandom |
135 | 144 |
136 // syscall interface implementation for other packages | 145 // syscall interface implementation for other packages |
137 | |
138 func Sleep(nsec int64) (errno int) { | |
139 nsec += 999999 // round up to milliseconds | |
140 msec := uint32(nsec / 1e6) | |
141 sleep(msec) | |
142 errno = 0 | |
143 return | |
144 } | |
145 | 146 |
146 func Errstr(errno int) string { | 147 func Errstr(errno int) string { |
147 if errno == EWINDOWS { | 148 if errno == EWINDOWS { |
148 return "not supported by windows" | 149 return "not supported by windows" |
149 } | 150 } |
| 151 var flags uint32 = FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ARGUMENT_
ARRAY | FORMAT_MESSAGE_IGNORE_INSERTS |
150 b := make([]uint16, 300) | 152 b := make([]uint16, 300) |
151 » n, err := FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_ARGUME
NT_ARRAY, 0, uint32(errno), 0, b, nil) | 153 » n, err := FormatMessage(flags, 0, uint32(errno), 0, b, nil) |
152 if err != 0 { | 154 if err != 0 { |
153 return "error " + str(errno) + " (FormatMessage failed with err=
" + str(err) + ")" | 155 return "error " + str(errno) + " (FormatMessage failed with err=
" + str(err) + ")" |
154 } | 156 } |
155 return string(utf16.Decode(b[0 : n-1])) | 157 return string(utf16.Decode(b[0 : n-1])) |
156 } | 158 } |
157 | 159 |
158 func Exit(code int) { ExitProcess(uint32(code)) } | 160 func Exit(code int) { ExitProcess(uint32(code)) } |
159 | 161 |
160 func Open(path string, mode int, perm int) (fd int, errno int) { | 162 func Open(path string, mode int, perm int) (fd int, errno int) { |
161 if len(path) == 0 { | 163 if len(path) == 0 { |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
374 func Gettimeofday(tv *Timeval) (errno int) { | 376 func Gettimeofday(tv *Timeval) (errno int) { |
375 var ft Filetime | 377 var ft Filetime |
376 GetSystemTimeAsFileTime(&ft) | 378 GetSystemTimeAsFileTime(&ft) |
377 ms := ft.Microseconds() | 379 ms := ft.Microseconds() |
378 // split into sec / usec | 380 // split into sec / usec |
379 tv.Sec = int32(ms / 1e6) | 381 tv.Sec = int32(ms / 1e6) |
380 tv.Usec = int32(ms) - tv.Sec | 382 tv.Usec = int32(ms) - tv.Sec |
381 return 0 | 383 return 0 |
382 } | 384 } |
383 | 385 |
| 386 func Sleep(nsec int64) (errno int) { |
| 387 sleep(uint32((nsec + 1e6 - 1) / 1e6)) // round up to milliseconds |
| 388 return 0 |
| 389 } |
| 390 |
384 // TODO(brainman): implement Utimes, or rewrite os.file.Chtimes() instead | 391 // TODO(brainman): implement Utimes, or rewrite os.file.Chtimes() instead |
385 func Utimes(path string, tv []Timeval) (errno int) { | 392 func Utimes(path string, tv []Timeval) (errno int) { |
386 return EWINDOWS | 393 return EWINDOWS |
387 } | 394 } |
| 395 |
| 396 // net api calls |
| 397 |
| 398 //sys WSAStartup(verreq uint32, data *WSAData) (sockerrno int) = wsock32.WSASt
artup |
| 399 //sys WSACleanup() (errno int) [failretval=-1] = wsock32.WSACleanup |
| 400 //sys socket(af int32, typ int32, protocol int32) (handle int32, errno int) [f
ailretval=-1] = wsock32.socket |
| 401 //sys setsockopt(s int32, level int32, optname int32, optval *byte, optlen int
32) (errno int) [failretval=-1] = wsock32.setsockopt |
| 402 //sys bind(s int32, name uintptr, namelen int32) (errno int) [failretval=-1] =
wsock32.bind |
| 403 //sys connect(s int32, name uintptr, namelen int32) (errno int) [failretval=-1
] = wsock32.connect |
| 404 //sys getsockname(s int32, rsa *RawSockaddrAny, addrlen *int32) (errno int) [f
ailretval=-1] = wsock32.getsockname |
| 405 //sys getpeername(s int32, rsa *RawSockaddrAny, addrlen *int32) (errno int) [f
ailretval=-1] = wsock32.getpeername |
| 406 //sys listen(s int32, backlog int32) (errno int) [failretval=-1] = wsock32.lis
ten |
| 407 //sys shutdown(s int32, how int32) (errno int) [failretval=-1] = wsock32.shutd
own |
| 408 //sys AcceptEx(ls uint32, as uint32, buf *byte, rxdatalen uint32, laddrlen uin
t32, raddrlen uint32, recvd *uint32, overlapped *Overlapped) (ok bool, errno int
) = wsock32.AcceptEx |
| 409 //sys GetAcceptExSockaddrs(buf *byte, rxdatalen uint32, laddrlen uint32, raddr
len uint32, lrsa **RawSockaddrAny, lrsalen *int32, rrsa **RawSockaddrAny, rrsale
n *int32) = wsock32.GetAcceptExSockaddrs |
| 410 //sys WSARecv(s uint32, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uin
t32, overlapped *Overlapped, croutine *byte) (errno int) [failretval=-1] = ws2_3
2.WSARecv |
| 411 //sys WSASend(s uint32, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint3
2, overlapped *Overlapped, croutine *byte) (errno int) [failretval=-1] = ws2_32.
WSASend |
| 412 |
| 413 type RawSockaddrInet4 struct { |
| 414 Family uint16 |
| 415 Port uint16 |
| 416 Addr [4]byte /* in_addr */ |
| 417 Zero [8]uint8 |
| 418 } |
| 419 |
| 420 type RawSockaddr struct { |
| 421 Family uint16 |
| 422 Data [14]int8 |
| 423 } |
| 424 |
| 425 type RawSockaddrAny struct { |
| 426 Addr RawSockaddr |
| 427 Pad [96]int8 |
| 428 } |
| 429 |
| 430 type Sockaddr interface { |
| 431 sockaddr() (ptr uintptr, len int32, errno int) // lowercase; only we can
define Sockaddrs |
| 432 } |
| 433 |
| 434 type SockaddrInet4 struct { |
| 435 Port int |
| 436 Addr [4]byte |
| 437 raw RawSockaddrInet4 |
| 438 } |
| 439 |
| 440 func (sa *SockaddrInet4) sockaddr() (uintptr, int32, int) { |
| 441 if sa.Port < 0 || sa.Port > 0xFFFF { |
| 442 return 0, 0, EINVAL |
| 443 } |
| 444 sa.raw.Family = AF_INET |
| 445 p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) |
| 446 p[0] = byte(sa.Port >> 8) |
| 447 p[1] = byte(sa.Port) |
| 448 for i := 0; i < len(sa.Addr); i++ { |
| 449 sa.raw.Addr[i] = sa.Addr[i] |
| 450 } |
| 451 return uintptr(unsafe.Pointer(&sa.raw)), int32(unsafe.Sizeof(sa.raw)), 0 |
| 452 } |
| 453 |
| 454 type SockaddrInet6 struct { |
| 455 Port int |
| 456 Addr [16]byte |
| 457 } |
| 458 |
| 459 func (sa *SockaddrInet6) sockaddr() (uintptr, int32, int) { |
| 460 // TODO(brainman): implement SockaddrInet6.sockaddr() |
| 461 return 0, 0, EWINDOWS |
| 462 } |
| 463 |
| 464 type SockaddrUnix struct { |
| 465 Name string |
| 466 } |
| 467 |
| 468 func (sa *SockaddrUnix) sockaddr() (uintptr, int32, int) { |
| 469 // TODO(brainman): implement SockaddrUnix.sockaddr() |
| 470 return 0, 0, EWINDOWS |
| 471 } |
| 472 |
| 473 func (rsa *RawSockaddrAny) Sockaddr() (Sockaddr, int) { |
| 474 switch rsa.Addr.Family { |
| 475 case AF_UNIX: |
| 476 return nil, EWINDOWS |
| 477 |
| 478 case AF_INET: |
| 479 pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) |
| 480 sa := new(SockaddrInet4) |
| 481 p := (*[2]byte)(unsafe.Pointer(&pp.Port)) |
| 482 sa.Port = int(p[0])<<8 + int(p[1]) |
| 483 for i := 0; i < len(sa.Addr); i++ { |
| 484 sa.Addr[i] = pp.Addr[i] |
| 485 } |
| 486 return sa, 0 |
| 487 |
| 488 case AF_INET6: |
| 489 return nil, EWINDOWS |
| 490 } |
| 491 return nil, EAFNOSUPPORT |
| 492 } |
| 493 |
| 494 func Socket(domain, typ, proto int) (fd, errno int) { |
| 495 h, e := socket(int32(domain), int32(typ), int32(proto)) |
| 496 return int(h), int(e) |
| 497 } |
| 498 |
| 499 func SetsockoptInt(fd, level, opt int, value int) (errno int) { |
| 500 v := int32(value) |
| 501 return int(setsockopt(int32(fd), int32(level), int32(opt), (*byte)(unsaf
e.Pointer(&v)), int32(unsafe.Sizeof(v)))) |
| 502 } |
| 503 |
| 504 func Bind(fd int, sa Sockaddr) (errno int) { |
| 505 ptr, n, err := sa.sockaddr() |
| 506 if err != 0 { |
| 507 return err |
| 508 } |
| 509 return bind(int32(fd), ptr, n) |
| 510 } |
| 511 |
| 512 func Connect(fd int, sa Sockaddr) (errno int) { |
| 513 ptr, n, err := sa.sockaddr() |
| 514 if err != 0 { |
| 515 return err |
| 516 } |
| 517 return connect(int32(fd), ptr, n) |
| 518 } |
| 519 |
| 520 func Getsockname(fd int) (sa Sockaddr, errno int) { |
| 521 var rsa RawSockaddrAny |
| 522 l := int32(unsafe.Sizeof(rsa)) |
| 523 if errno = getsockname(int32(fd), &rsa, &l); errno != 0 { |
| 524 return |
| 525 } |
| 526 return rsa.Sockaddr() |
| 527 } |
| 528 |
| 529 func Getpeername(fd int) (sa Sockaddr, errno int) { |
| 530 var rsa RawSockaddrAny |
| 531 l := int32(unsafe.Sizeof(rsa)) |
| 532 if errno = getpeername(int32(fd), &rsa, &l); errno != 0 { |
| 533 return |
| 534 } |
| 535 return rsa.Sockaddr() |
| 536 } |
| 537 |
| 538 func Listen(s int, n int) (errno int) { |
| 539 return int(listen(int32(s), int32(n))) |
| 540 } |
| 541 |
| 542 func Shutdown(fd, how int) (errno int) { |
| 543 return int(shutdown(int32(fd), int32(how))) |
| 544 } |
| 545 |
| 546 func AcceptIOCP(iocpfd, fd int, o *Overlapped) (attrs *byte, errno int) { |
| 547 // Will ask for local and remote address only. |
| 548 rsa := make([]RawSockaddrAny, 2) |
| 549 attrs = (*byte)(unsafe.Pointer(&rsa[0])) |
| 550 alen := uint32(unsafe.Sizeof(rsa[0])) |
| 551 var done uint32 |
| 552 _, errno = AcceptEx(uint32(iocpfd), uint32(fd), attrs, 0, alen, alen, &d
one, o) |
| 553 return |
| 554 } |
| 555 |
| 556 func GetAcceptIOCPSockaddrs(attrs *byte) (lsa, rsa Sockaddr) { |
| 557 var lrsa, rrsa *RawSockaddrAny |
| 558 var llen, rlen int32 |
| 559 alen := uint32(unsafe.Sizeof(*lrsa)) |
| 560 GetAcceptExSockaddrs(attrs, 0, alen, alen, &lrsa, &llen, &rrsa, &rlen) |
| 561 lsa, _ = lrsa.Sockaddr() |
| 562 rsa, _ = rrsa.Sockaddr() |
| 563 return |
| 564 } |
| 565 |
| 566 // TODO(brainman): fix all needed for net |
| 567 |
| 568 func Accept(fd int) (nfd int, sa Sockaddr, errno int) { r
eturn 0, nil, EWINDOWS } |
| 569 func Recvfrom(fd int, p []byte, flags int) (n int, from Sockaddr, errno int) { r
eturn 0, nil, EWINDOWS } |
| 570 func Sendto(fd int, p []byte, flags int, to Sockaddr) (errno int) { r
eturn EWINDOWS } |
| 571 func SetsockoptTimeval(fd, level, opt int, tv *Timeval) (errno int) { r
eturn EWINDOWS } |
| 572 |
| 573 type Linger struct { |
| 574 Onoff int32 |
| 575 Linger int32 |
| 576 } |
| 577 |
| 578 func SetsockoptLinger(fd, level, opt int, l *Linger) (errno int) { return EWINDO
WS } |
| 579 func BindToDevice(fd int, device string) (errno int) { return EWINDO
WS } |
388 | 580 |
389 // TODO(brainman): fix all needed for os | 581 // TODO(brainman): fix all needed for os |
390 | 582 |
391 const ( | 583 const ( |
392 SIGTRAP = 5 | 584 SIGTRAP = 5 |
393 ) | 585 ) |
394 | 586 |
395 func Getpid() (pid int) { return -1 } | 587 func Getpid() (pid int) { return -1 } |
396 func Getppid() (ppid int) { return -1 } | 588 func Getppid() (ppid int) { return -1 } |
397 | 589 |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
468 | 660 |
469 func (WaitStatus) Stopped() bool { return false } | 661 func (WaitStatus) Stopped() bool { return false } |
470 | 662 |
471 func (WaitStatus) Continued() bool { return false } | 663 func (WaitStatus) Continued() bool { return false } |
472 | 664 |
473 func (WaitStatus) StopSignal() int { return -1 } | 665 func (WaitStatus) StopSignal() int { return -1 } |
474 | 666 |
475 func (WaitStatus) Signaled() bool { return false } | 667 func (WaitStatus) Signaled() bool { return false } |
476 | 668 |
477 func (WaitStatus) TrapCause() int { return -1 } | 669 func (WaitStatus) TrapCause() int { return -1 } |
LEFT | RIGHT |