aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlbert Strasheim <fullung@gmail.com>2011-01-19 14:34:53 -0500
committerRuss Cox <rsc@golang.org>2011-01-19 14:34:53 -0500
commit3a97119517423b8ba5e172d4101f273c0cbea86e (patch)
tree5c0603a60ae0f75d1c8a96aeeed4274c8e54cc52
parent655da9962769e5dd1a3c6247bc74cb1eac6f8c78 (diff)
downloadgo-3a97119517423b8ba5e172d4101f273c0cbea86e.tar.gz
go-3a97119517423b8ba5e172d4101f273c0cbea86e.zip
net, syscall: return source address in Recvmsg
R=rsc CC=golang-dev https://golang.org/cl/3766042
-rw-r--r--src/pkg/net/fd.go2
-rw-r--r--src/pkg/syscall/syscall_bsd.go4
-rw-r--r--src/pkg/syscall/syscall_linux.go6
3 files changed, 8 insertions, 4 deletions
diff --git a/src/pkg/net/fd.go b/src/pkg/net/fd.go
index 5ec91845df..896178f18e 100644
--- a/src/pkg/net/fd.go
+++ b/src/pkg/net/fd.go
@@ -417,7 +417,7 @@ func (fd *netFD) ReadMsg(p []byte, oob []byte) (n, oobn, flags int, sa syscall.S
var oserr os.Error
for {
var errno int
- n, oobn, flags, errno = syscall.Recvmsg(fd.sysfd, p, oob, sa, 0)
+ n, oobn, flags, sa, errno = syscall.Recvmsg(fd.sysfd, p, oob, 0)
if errno == syscall.EAGAIN && fd.rdeadline >= 0 {
pollserver.WaitRead(fd)
continue
diff --git a/src/pkg/syscall/syscall_bsd.go b/src/pkg/syscall/syscall_bsd.go
index ff99fd9e6d..3c4ac51dc0 100644
--- a/src/pkg/syscall/syscall_bsd.go
+++ b/src/pkg/syscall/syscall_bsd.go
@@ -485,8 +485,8 @@ func Futimes(fd int, tv []Timeval) (errno int) {
//sys fcntl(fd int, cmd int, arg int) (val int, errno int)
-func Recvmsg(fd int, p, oob []byte, from Sockaddr, flags int) (n, oobn int, recvflags int, errno int) {
- return 0, 0, 0, EAFNOSUPPORT
+func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, errno int) {
+ return 0, 0, 0, nil, EAFNOSUPPORT
}
func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (errno int) {
diff --git a/src/pkg/syscall/syscall_linux.go b/src/pkg/syscall/syscall_linux.go
index d0f314c88b..d20c035b5a 100644
--- a/src/pkg/syscall/syscall_linux.go
+++ b/src/pkg/syscall/syscall_linux.go
@@ -450,7 +450,7 @@ 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) {
+func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, errno int) {
var msg Msghdr
var rsa RawSockaddrAny
msg.Name = (*byte)(unsafe.Pointer(&rsa))
@@ -477,6 +477,10 @@ func Recvmsg(fd int, p, oob []byte, from Sockaddr, flags int) (n, oobn int, recv
}
oobn = int(msg.Controllen)
recvflags = int(msg.Flags)
+ // source address is only specified if the socket is unconnected
+ if rsa.Addr.Family != 0 {
+ from, errno = anyToSockaddr(&rsa)
+ }
return
}