mirror of
https://github.com/rwinkhart/sys.git
synced 2026-09-05 16:47:27 -04:00
windows: add WSA{Send,Recv}Msg
Change-Id: Id71df85e55e586b33fac66c5494291e11db8ed14 Reviewed-on: https://go-review.googlesource.com/76471 Reviewed-by: Alex Brainman <alex.brainman@gmail.com> Run-TryBot: Alex Brainman <alex.brainman@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
committed by
Alex Brainman
parent
bcc62b628a
commit
4b45465282
@@ -796,6 +796,75 @@ func ConnectEx(fd Handle, sa Sockaddr, sendBuf *byte, sendDataLen uint32, bytesS
|
|||||||
return connectEx(fd, ptr, n, sendBuf, sendDataLen, bytesSent, overlapped)
|
return connectEx(fd, ptr, n, sendBuf, sendDataLen, bytesSent, overlapped)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var sendRecvMsgFunc struct {
|
||||||
|
once sync.Once
|
||||||
|
sendAddr uintptr
|
||||||
|
recvAddr uintptr
|
||||||
|
err error
|
||||||
|
}
|
||||||
|
|
||||||
|
func loadWSASendRecvMsg() error {
|
||||||
|
sendRecvMsgFunc.once.Do(func() {
|
||||||
|
var s Handle
|
||||||
|
s, sendRecvMsgFunc.err = Socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
|
||||||
|
if sendRecvMsgFunc.err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer CloseHandle(s)
|
||||||
|
var n uint32
|
||||||
|
sendRecvMsgFunc.err = WSAIoctl(s,
|
||||||
|
SIO_GET_EXTENSION_FUNCTION_POINTER,
|
||||||
|
(*byte)(unsafe.Pointer(&WSAID_WSARECVMSG)),
|
||||||
|
uint32(unsafe.Sizeof(WSAID_WSARECVMSG)),
|
||||||
|
(*byte)(unsafe.Pointer(&sendRecvMsgFunc.recvAddr)),
|
||||||
|
uint32(unsafe.Sizeof(sendRecvMsgFunc.recvAddr)),
|
||||||
|
&n, nil, 0)
|
||||||
|
if sendRecvMsgFunc.err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
sendRecvMsgFunc.err = WSAIoctl(s,
|
||||||
|
SIO_GET_EXTENSION_FUNCTION_POINTER,
|
||||||
|
(*byte)(unsafe.Pointer(&WSAID_WSASENDMSG)),
|
||||||
|
uint32(unsafe.Sizeof(WSAID_WSASENDMSG)),
|
||||||
|
(*byte)(unsafe.Pointer(&sendRecvMsgFunc.sendAddr)),
|
||||||
|
uint32(unsafe.Sizeof(sendRecvMsgFunc.sendAddr)),
|
||||||
|
&n, nil, 0)
|
||||||
|
})
|
||||||
|
return sendRecvMsgFunc.err
|
||||||
|
}
|
||||||
|
|
||||||
|
func WSASendMsg(fd Handle, msg *WSAMsg, flags uint32, bytesSent *uint32, overlapped *Overlapped, croutine *byte) error {
|
||||||
|
err := loadWSASendRecvMsg()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
r1, _, e1 := syscall.Syscall6(sendRecvMsgFunc.sendAddr, 6, uintptr(fd), uintptr(unsafe.Pointer(msg)), uintptr(flags), uintptr(unsafe.Pointer(bytesSent)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)))
|
||||||
|
if r1 == socket_error {
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
} else {
|
||||||
|
err = syscall.EINVAL
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func WSARecvMsg(fd Handle, msg *WSAMsg, bytesReceived *uint32, overlapped *Overlapped, croutine *byte) error {
|
||||||
|
err := loadWSASendRecvMsg()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
r1, _, e1 := syscall.Syscall6(sendRecvMsgFunc.recvAddr, 5, uintptr(fd), uintptr(unsafe.Pointer(msg)), uintptr(unsafe.Pointer(bytesReceived)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0)
|
||||||
|
if r1 == socket_error {
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
} else {
|
||||||
|
err = syscall.EINVAL
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// Invented structures to support what package os expects.
|
// Invented structures to support what package os expects.
|
||||||
type Rusage struct {
|
type Rusage struct {
|
||||||
CreationTime Filetime
|
CreationTime Filetime
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ const (
|
|||||||
ERROR_NOT_FOUND syscall.Errno = 1168
|
ERROR_NOT_FOUND syscall.Errno = 1168
|
||||||
ERROR_PRIVILEGE_NOT_HELD syscall.Errno = 1314
|
ERROR_PRIVILEGE_NOT_HELD syscall.Errno = 1314
|
||||||
WSAEACCES syscall.Errno = 10013
|
WSAEACCES syscall.Errno = 10013
|
||||||
|
WSAEMSGSIZE syscall.Errno = 10040
|
||||||
WSAECONNRESET syscall.Errno = 10054
|
WSAECONNRESET syscall.Errno = 10054
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -567,6 +568,16 @@ const (
|
|||||||
IPV6_JOIN_GROUP = 0xc
|
IPV6_JOIN_GROUP = 0xc
|
||||||
IPV6_LEAVE_GROUP = 0xd
|
IPV6_LEAVE_GROUP = 0xd
|
||||||
|
|
||||||
|
MSG_OOB = 0x1
|
||||||
|
MSG_PEEK = 0x2
|
||||||
|
MSG_DONTROUTE = 0x4
|
||||||
|
MSG_WAITALL = 0x8
|
||||||
|
|
||||||
|
MSG_TRUNC = 0x0100
|
||||||
|
MSG_CTRUNC = 0x0200
|
||||||
|
MSG_BCAST = 0x0400
|
||||||
|
MSG_MCAST = 0x0800
|
||||||
|
|
||||||
SOMAXCONN = 0x7fffffff
|
SOMAXCONN = 0x7fffffff
|
||||||
|
|
||||||
TCP_NODELAY = 1
|
TCP_NODELAY = 1
|
||||||
@@ -584,6 +595,15 @@ type WSABuf struct {
|
|||||||
Buf *byte
|
Buf *byte
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type WSAMsg struct {
|
||||||
|
Name *syscall.RawSockaddrAny
|
||||||
|
Namelen int32
|
||||||
|
Buffers *WSABuf
|
||||||
|
BufferCount uint32
|
||||||
|
Control WSABuf
|
||||||
|
Flags uint32
|
||||||
|
}
|
||||||
|
|
||||||
// Invented values to support what package os expects.
|
// Invented values to support what package os expects.
|
||||||
const (
|
const (
|
||||||
S_IFMT = 0x1f000
|
S_IFMT = 0x1f000
|
||||||
@@ -1011,6 +1031,20 @@ var WSAID_CONNECTEX = GUID{
|
|||||||
[8]byte{0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e},
|
[8]byte{0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var WSAID_WSASENDMSG = GUID{
|
||||||
|
0xa441e712,
|
||||||
|
0x754f,
|
||||||
|
0x43ca,
|
||||||
|
[8]byte{0x84, 0xa7, 0x0d, 0xee, 0x44, 0xcf, 0x60, 0x6d},
|
||||||
|
}
|
||||||
|
|
||||||
|
var WSAID_WSARECVMSG = GUID{
|
||||||
|
0xf689d7c8,
|
||||||
|
0x6f1f,
|
||||||
|
0x436b,
|
||||||
|
[8]byte{0x8a, 0x53, 0xe5, 0x4f, 0xe3, 0x51, 0xc3, 0x22},
|
||||||
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
FILE_SKIP_COMPLETION_PORT_ON_SUCCESS = 1
|
FILE_SKIP_COMPLETION_PORT_ON_SUCCESS = 1
|
||||||
FILE_SKIP_SET_EVENT_ON_HANDLE = 2
|
FILE_SKIP_SET_EVENT_ON_HANDLE = 2
|
||||||
|
|||||||
Reference in New Issue
Block a user