mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
syscall, net: Add Recvmsg and Sendmsg on Linux.
Working on issue 1101. R=rsc CC=golang-dev https://golang.org/cl/2331044
This commit is contained in:
parent
ed7c3f3127
commit
cf6c212197
11 changed files with 326 additions and 5 deletions
|
|
@ -447,6 +447,72 @@ func Sendto(fd int, p []byte, flags int, to Sockaddr) (errno int) {
|
|||
return sendto(fd, p, flags, ptr, n)
|
||||
}
|
||||
|
||||
func Recvmsg(fd int, p, oob []byte, from Sockaddr, flags int) (n, oobn int, recvflags int, errno int) {
|
||||
var msg Msghdr
|
||||
var rsa RawSockaddrAny
|
||||
msg.Name = (*byte)(unsafe.Pointer(&rsa))
|
||||
msg.Namelen = uint32(SizeofSockaddrAny)
|
||||
var iov Iovec
|
||||
if len(p) > 0 {
|
||||
iov.Base = (*byte)(unsafe.Pointer(&p[0]))
|
||||
iov.SetLen(len(p))
|
||||
}
|
||||
var dummy byte
|
||||
if len(oob) > 0 {
|
||||
// receive at least one normal byte
|
||||
if len(p) == 0 {
|
||||
iov.Base = &dummy
|
||||
iov.SetLen(1)
|
||||
}
|
||||
msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
|
||||
msg.SetControllen(len(oob))
|
||||
}
|
||||
msg.Iov = &iov
|
||||
msg.Iovlen = 1
|
||||
if n, errno = recvmsg(fd, &msg, flags); errno != 0 {
|
||||
return
|
||||
}
|
||||
oobn = int(msg.Controllen)
|
||||
recvflags = int(msg.Flags)
|
||||
return
|
||||
}
|
||||
|
||||
func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (errno int) {
|
||||
var ptr uintptr
|
||||
var nsock _Socklen
|
||||
if to != nil {
|
||||
var err int
|
||||
ptr, nsock, err = to.sockaddr()
|
||||
if err != 0 {
|
||||
return err
|
||||
}
|
||||
}
|
||||
var msg Msghdr
|
||||
msg.Name = (*byte)(unsafe.Pointer(ptr))
|
||||
msg.Namelen = uint32(nsock)
|
||||
var iov Iovec
|
||||
if len(p) > 0 {
|
||||
iov.Base = (*byte)(unsafe.Pointer(&p[0]))
|
||||
iov.SetLen(len(p))
|
||||
}
|
||||
var dummy byte
|
||||
if len(oob) > 0 {
|
||||
// send at least one normal byte
|
||||
if len(p) == 0 {
|
||||
iov.Base = &dummy
|
||||
iov.SetLen(1)
|
||||
}
|
||||
msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
|
||||
msg.SetControllen(len(oob))
|
||||
}
|
||||
msg.Iov = &iov
|
||||
msg.Iovlen = 1
|
||||
if errno = sendmsg(fd, &msg, flags); errno != 0 {
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// BindToDevice binds the socket associated with fd to device.
|
||||
func BindToDevice(fd int, device string) (errno int) {
|
||||
return SetsockoptString(fd, SOL_SOCKET, SO_BINDTODEVICE, device)
|
||||
|
|
@ -592,8 +658,6 @@ func PtraceDetach(pid int) (errno int) { return ptrace(PTRACE_DETACH, pid, 0, 0)
|
|||
|
||||
// Sendto
|
||||
// Recvfrom
|
||||
// Sendmsg
|
||||
// Recvmsg
|
||||
// Socketpair
|
||||
// Getsockopt
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue