Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(1127)

Delta Between Two Patch Sets: src/pkg/syscall/syscall_windows.go

Issue 1578041: code review 1578041: add Windows ForkExec, Syscall12 (Closed)
Left Patch Set: code review 1578041: add Windows ForkExec, Syscall12 Created 13 years, 9 months ago
Right Patch Set: code review 1578041: add Windows ForkExec, Syscall12 Created 13 years, 8 months ago
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
Left: Side by side diff | Download
Right: Side by side diff | Download
« no previous file with change/comment | « src/pkg/syscall/mksyscall_windows.sh ('k') | src/pkg/syscall/zsyscall_windows_386.go » ('j') | no next file with change/comment »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
LEFTRIGHT
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
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
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
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 }
LEFTRIGHT

Powered by Google App Engine
RSS Feeds Recent Issues | This issue
This is Rietveld f62528b