OLD | NEW |
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 errorspkg "errors" | 10 errorspkg "errors" |
(...skipping 505 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
516 // net api calls | 516 // net api calls |
517 | 517 |
518 const socket_error = uintptr(^uint32(0)) | 518 const socket_error = uintptr(^uint32(0)) |
519 | 519 |
520 //sys WSAStartup(verreq uint32, data *WSAData) (sockerr error) = ws2_32.WSASta
rtup | 520 //sys WSAStartup(verreq uint32, data *WSAData) (sockerr error) = ws2_32.WSASta
rtup |
521 //sys WSACleanup() (err error) [failretval==socket_error] = ws2_32.WSACleanup | 521 //sys WSACleanup() (err error) [failretval==socket_error] = ws2_32.WSACleanup |
522 //sys WSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte,
cbob uint32, cbbr *uint32, overlapped *Overlapped, completionRoutine uintptr) (e
rr error) [failretval==socket_error] = ws2_32.WSAIoctl | 522 //sys WSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte,
cbob uint32, cbbr *uint32, overlapped *Overlapped, completionRoutine uintptr) (e
rr error) [failretval==socket_error] = ws2_32.WSAIoctl |
523 //sys socket(af int32, typ int32, protocol int32) (handle Handle, err error) [
failretval==InvalidHandle] = ws2_32.socket | 523 //sys socket(af int32, typ int32, protocol int32) (handle Handle, err error) [
failretval==InvalidHandle] = ws2_32.socket |
524 //sys Setsockopt(s Handle, level int32, optname int32, optval *byte, optlen in
t32) (err error) [failretval==socket_error] = ws2_32.setsockopt | 524 //sys Setsockopt(s Handle, level int32, optname int32, optval *byte, optlen in
t32) (err error) [failretval==socket_error] = ws2_32.setsockopt |
525 //sys Getsockopt(s Handle, level int32, optname int32, optval *byte, optlen *i
nt32) (err error) [failretval==socket_error] = ws2_32.getsockopt | 525 //sys Getsockopt(s Handle, level int32, optname int32, optval *byte, optlen *i
nt32) (err error) [failretval==socket_error] = ws2_32.getsockopt |
526 //sys» bind(s Handle, name uintptr, namelen int32) (err error) [failretval==soc
ket_error] = ws2_32.bind | 526 //sys» bind(s Handle, name unsafe.Pointer, namelen int32) (err error) [failretv
al==socket_error] = ws2_32.bind |
527 //sys» connect(s Handle, name uintptr, namelen int32) (err error) [failretval==
socket_error] = ws2_32.connect | 527 //sys» connect(s Handle, name unsafe.Pointer, namelen int32) (err error) [failr
etval==socket_error] = ws2_32.connect |
528 //sys getsockname(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) [
failretval==socket_error] = ws2_32.getsockname | 528 //sys getsockname(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) [
failretval==socket_error] = ws2_32.getsockname |
529 //sys getpeername(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) [
failretval==socket_error] = ws2_32.getpeername | 529 //sys getpeername(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) [
failretval==socket_error] = ws2_32.getpeername |
530 //sys listen(s Handle, backlog int32) (err error) [failretval==socket_error] =
ws2_32.listen | 530 //sys listen(s Handle, backlog int32) (err error) [failretval==socket_error] =
ws2_32.listen |
531 //sys shutdown(s Handle, how int32) (err error) [failretval==socket_error] = w
s2_32.shutdown | 531 //sys shutdown(s Handle, how int32) (err error) [failretval==socket_error] = w
s2_32.shutdown |
532 //sys Closesocket(s Handle) (err error) [failretval==socket_error] = ws2_32.cl
osesocket | 532 //sys Closesocket(s Handle) (err error) [failretval==socket_error] = ws2_32.cl
osesocket |
533 //sys AcceptEx(ls Handle, as Handle, buf *byte, rxdatalen uint32, laddrlen uin
t32, raddrlen uint32, recvd *uint32, overlapped *Overlapped) (err error) = mswso
ck.AcceptEx | 533 //sys AcceptEx(ls Handle, as Handle, buf *byte, rxdatalen uint32, laddrlen uin
t32, raddrlen uint32, recvd *uint32, overlapped *Overlapped) (err error) = mswso
ck.AcceptEx |
534 //sys GetAcceptExSockaddrs(buf *byte, rxdatalen uint32, laddrlen uint32, raddr
len uint32, lrsa **RawSockaddrAny, lrsalen *int32, rrsa **RawSockaddrAny, rrsale
n *int32) = mswsock.GetAcceptExSockaddrs | 534 //sys GetAcceptExSockaddrs(buf *byte, rxdatalen uint32, laddrlen uint32, raddr
len uint32, lrsa **RawSockaddrAny, lrsalen *int32, rrsa **RawSockaddrAny, rrsale
n *int32) = mswsock.GetAcceptExSockaddrs |
535 //sys WSARecv(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uin
t32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_err
or] = ws2_32.WSARecv | 535 //sys WSARecv(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uin
t32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_err
or] = ws2_32.WSARecv |
536 //sys WSASend(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint3
2, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error
] = ws2_32.WSASend | 536 //sys WSASend(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint3
2, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error
] = ws2_32.WSASend |
537 //sys WSARecvFrom(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags
*uint32, from *RawSockaddrAny, fromlen *int32, overlapped *Overlapped, croutine
*byte) (err error) [failretval==socket_error] = ws2_32.WSARecvFrom | 537 //sys WSARecvFrom(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags
*uint32, from *RawSockaddrAny, fromlen *int32, overlapped *Overlapped, croutine
*byte) (err error) [failretval==socket_error] = ws2_32.WSARecvFrom |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
572 Family uint16 | 572 Family uint16 |
573 Data [14]int8 | 573 Data [14]int8 |
574 } | 574 } |
575 | 575 |
576 type RawSockaddrAny struct { | 576 type RawSockaddrAny struct { |
577 Addr RawSockaddr | 577 Addr RawSockaddr |
578 Pad [96]int8 | 578 Pad [96]int8 |
579 } | 579 } |
580 | 580 |
581 type Sockaddr interface { | 581 type Sockaddr interface { |
582 » sockaddr() (ptr uintptr, len int32, err error) // lowercase; only we can
define Sockaddrs | 582 » sockaddr() (ptr unsafe.Pointer, len int32, err error) // lowercase; only
we can define Sockaddrs |
583 } | 583 } |
584 | 584 |
585 type SockaddrInet4 struct { | 585 type SockaddrInet4 struct { |
586 Port int | 586 Port int |
587 Addr [4]byte | 587 Addr [4]byte |
588 raw RawSockaddrInet4 | 588 raw RawSockaddrInet4 |
589 } | 589 } |
590 | 590 |
591 func (sa *SockaddrInet4) sockaddr() (uintptr, int32, error) { | 591 func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, int32, error) { |
592 if sa.Port < 0 || sa.Port > 0xFFFF { | 592 if sa.Port < 0 || sa.Port > 0xFFFF { |
593 » » return 0, 0, EINVAL | 593 » » return nil, 0, EINVAL |
594 } | 594 } |
595 sa.raw.Family = AF_INET | 595 sa.raw.Family = AF_INET |
596 p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) | 596 p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) |
597 p[0] = byte(sa.Port >> 8) | 597 p[0] = byte(sa.Port >> 8) |
598 p[1] = byte(sa.Port) | 598 p[1] = byte(sa.Port) |
599 for i := 0; i < len(sa.Addr); i++ { | 599 for i := 0; i < len(sa.Addr); i++ { |
600 sa.raw.Addr[i] = sa.Addr[i] | 600 sa.raw.Addr[i] = sa.Addr[i] |
601 } | 601 } |
602 » return uintptr(unsafe.Pointer(&sa.raw)), int32(unsafe.Sizeof(sa.raw)), n
il | 602 » return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil |
603 } | 603 } |
604 | 604 |
605 type SockaddrInet6 struct { | 605 type SockaddrInet6 struct { |
606 Port int | 606 Port int |
607 ZoneId uint32 | 607 ZoneId uint32 |
608 Addr [16]byte | 608 Addr [16]byte |
609 raw RawSockaddrInet6 | 609 raw RawSockaddrInet6 |
610 } | 610 } |
611 | 611 |
612 func (sa *SockaddrInet6) sockaddr() (uintptr, int32, error) { | 612 func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, int32, error) { |
613 if sa.Port < 0 || sa.Port > 0xFFFF { | 613 if sa.Port < 0 || sa.Port > 0xFFFF { |
614 » » return 0, 0, EINVAL | 614 » » return nil, 0, EINVAL |
615 } | 615 } |
616 sa.raw.Family = AF_INET6 | 616 sa.raw.Family = AF_INET6 |
617 p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) | 617 p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) |
618 p[0] = byte(sa.Port >> 8) | 618 p[0] = byte(sa.Port >> 8) |
619 p[1] = byte(sa.Port) | 619 p[1] = byte(sa.Port) |
620 sa.raw.Scope_id = sa.ZoneId | 620 sa.raw.Scope_id = sa.ZoneId |
621 for i := 0; i < len(sa.Addr); i++ { | 621 for i := 0; i < len(sa.Addr); i++ { |
622 sa.raw.Addr[i] = sa.Addr[i] | 622 sa.raw.Addr[i] = sa.Addr[i] |
623 } | 623 } |
624 » return uintptr(unsafe.Pointer(&sa.raw)), int32(unsafe.Sizeof(sa.raw)), n
il | 624 » return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil |
625 } | 625 } |
626 | 626 |
627 type SockaddrUnix struct { | 627 type SockaddrUnix struct { |
628 Name string | 628 Name string |
629 } | 629 } |
630 | 630 |
631 func (sa *SockaddrUnix) sockaddr() (uintptr, int32, error) { | 631 func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, int32, error) { |
632 // TODO(brainman): implement SockaddrUnix.sockaddr() | 632 // TODO(brainman): implement SockaddrUnix.sockaddr() |
633 » return 0, 0, EWINDOWS | 633 » return nil, 0, EWINDOWS |
634 } | 634 } |
635 | 635 |
636 func (rsa *RawSockaddrAny) Sockaddr() (Sockaddr, error) { | 636 func (rsa *RawSockaddrAny) Sockaddr() (Sockaddr, error) { |
637 switch rsa.Addr.Family { | 637 switch rsa.Addr.Family { |
638 case AF_UNIX: | 638 case AF_UNIX: |
639 return nil, EWINDOWS | 639 return nil, EWINDOWS |
640 | 640 |
641 case AF_INET: | 641 case AF_INET: |
642 pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) | 642 pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) |
643 sa := new(SockaddrInet4) | 643 sa := new(SockaddrInet4) |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
747 SIO_GET_EXTENSION_FUNCTION_POINTER, | 747 SIO_GET_EXTENSION_FUNCTION_POINTER, |
748 (*byte)(unsafe.Pointer(&WSAID_CONNECTEX)), | 748 (*byte)(unsafe.Pointer(&WSAID_CONNECTEX)), |
749 uint32(unsafe.Sizeof(WSAID_CONNECTEX)), | 749 uint32(unsafe.Sizeof(WSAID_CONNECTEX)), |
750 (*byte)(unsafe.Pointer(&connectExFunc.addr)), | 750 (*byte)(unsafe.Pointer(&connectExFunc.addr)), |
751 uint32(unsafe.Sizeof(connectExFunc.addr)), | 751 uint32(unsafe.Sizeof(connectExFunc.addr)), |
752 &n, nil, 0) | 752 &n, nil, 0) |
753 }) | 753 }) |
754 return connectExFunc.err | 754 return connectExFunc.err |
755 } | 755 } |
756 | 756 |
757 func connectEx(s Handle, name uintptr, namelen int32, sendBuf *byte, sendDataLen
uint32, bytesSent *uint32, overlapped *Overlapped) (err error) { | 757 func connectEx(s Handle, name unsafe.Pointer, namelen int32, sendBuf *byte, send
DataLen uint32, bytesSent *uint32, overlapped *Overlapped) (err error) { |
758 r1, _, e1 := Syscall9(connectExFunc.addr, 7, uintptr(s), uintptr(name),
uintptr(namelen), uintptr(unsafe.Pointer(sendBuf)), uintptr(sendDataLen), uintpt
r(unsafe.Pointer(bytesSent)), uintptr(unsafe.Pointer(overlapped)), 0, 0) | 758 r1, _, e1 := Syscall9(connectExFunc.addr, 7, uintptr(s), uintptr(name),
uintptr(namelen), uintptr(unsafe.Pointer(sendBuf)), uintptr(sendDataLen), uintpt
r(unsafe.Pointer(bytesSent)), uintptr(unsafe.Pointer(overlapped)), 0, 0) |
759 if r1 == 0 { | 759 if r1 == 0 { |
760 if e1 != 0 { | 760 if e1 != 0 { |
761 err = error(e1) | 761 err = error(e1) |
762 } else { | 762 } else { |
763 err = EINVAL | 763 err = EINVAL |
764 } | 764 } |
765 } | 765 } |
766 return | 766 return |
767 } | 767 } |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
927 | 927 |
928 func (s Signal) String() string { | 928 func (s Signal) String() string { |
929 if 0 <= s && int(s) < len(signals) { | 929 if 0 <= s && int(s) < len(signals) { |
930 str := signals[s] | 930 str := signals[s] |
931 if str != "" { | 931 if str != "" { |
932 return str | 932 return str |
933 } | 933 } |
934 } | 934 } |
935 return "signal " + itoa(int(s)) | 935 return "signal " + itoa(int(s)) |
936 } | 936 } |
OLD | NEW |