Skip to content

Commit 6d18c01

Browse files
maltalexianlancetaylor
authored andcommitted
windows: add Recvfrom and Sendto implementations
Added the missing `Sendto` and `Recvfrom` syscalls for Windows. Fixes golang/go#7170 Change-Id: I794b4f631fad424400fec85ccecc3a3b3abe5465 GitHub-Last-Rev: 39ebe92 GitHub-Pull-Request: #46 Reviewed-on: https://go-review.googlesource.com/c/sys/+/208321 Run-TryBot: Ian Lance Taylor <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]>
1 parent 63cb32a commit 6d18c01

File tree

2 files changed

+55
-2
lines changed

2 files changed

+55
-2
lines changed

windows/syscall_windows.go

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -701,6 +701,8 @@ const socket_error = uintptr(^uint32(0))
701701
//sys WSACleanup() (err error) [failretval==socket_error] = ws2_32.WSACleanup
702702
//sys WSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte, cbob uint32, cbbr *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) [failretval==socket_error] = ws2_32.WSAIoctl
703703
//sys socket(af int32, typ int32, protocol int32) (handle Handle, err error) [failretval==InvalidHandle] = ws2_32.socket
704+
//sys sendto(s Handle, buf []byte, flags int, to unsafe.Pointer, tolen int32) (err error) [failretval==socket_error] = ws2_32.sendto
705+
//sys recvfrom(s Handle, buf []byte, flags int, from *RawSockaddrAny, fromlen *int) (n int, err error) [failretval==-1] = ws2_32.recvfrom
704706
//sys Setsockopt(s Handle, level int32, optname int32, optval *byte, optlen int32) (err error) [failretval==socket_error] = ws2_32.setsockopt
705707
//sys Getsockopt(s Handle, level int32, optname int32, optval *byte, optlen *int32) (err error) [failretval==socket_error] = ws2_32.getsockopt
706708
//sys bind(s Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socket_error] = ws2_32.bind
@@ -1129,10 +1131,26 @@ func NsecToTimespec(nsec int64) (ts Timespec) {
11291131
// TODO(brainman): fix all needed for net
11301132

11311133
func Accept(fd Handle) (nfd Handle, sa Sockaddr, err error) { return 0, nil, syscall.EWINDOWS }
1134+
11321135
func Recvfrom(fd Handle, p []byte, flags int) (n int, from Sockaddr, err error) {
1133-
return 0, nil, syscall.EWINDOWS
1136+
var rsa RawSockaddrAny
1137+
l := int(unsafe.Sizeof(rsa))
1138+
n, err = recvfrom(fd, p, flags, &rsa, &l)
1139+
if err != nil {
1140+
return
1141+
}
1142+
from, err = rsa.Sockaddr()
1143+
return
11341144
}
1135-
func Sendto(fd Handle, p []byte, flags int, to Sockaddr) (err error) { return syscall.EWINDOWS }
1145+
1146+
func Sendto(fd Handle, p []byte, flags int, to Sockaddr) (err error) {
1147+
ptr, l, err := to.sockaddr()
1148+
if err != nil {
1149+
return err
1150+
}
1151+
return sendto(fd, p, flags, ptr, l)
1152+
}
1153+
11361154
func SetsockoptTimeval(fd Handle, level, opt int, tv *Timeval) (err error) { return syscall.EWINDOWS }
11371155

11381156
// The Linger struct is wrong but we only noticed after Go 1.

windows/zsyscall_windows.go

Lines changed: 35 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)