]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: handle getsockname for unix sockets on openbsd 5.2
authorJoel Sing <jsing@google.com>
Tue, 5 Mar 2013 10:40:37 +0000 (21:40 +1100)
committerJoel Sing <jsing@google.com>
Tue, 5 Mar 2013 10:40:37 +0000 (21:40 +1100)
On OpenBSD 5.2, calling getsockname on an unbound Unix domain socket
results in a successful syscall, however the AF is unset and the length
is returned as zero. This has been changed to more portable behaviour,
which will be included in the OpenBSD 5.3 release.

For now, work around this by treating a successful getsockname() call
that returns a family of AF_UNSPEC and length of zero as a AF_UNIX
socket.

Makes TestPassFD work on OpenBSD 5.2.

Fixes #4956.

R=golang-dev, minux.ma, rsc, mikioh.mikioh
CC=golang-dev
https://golang.org/cl/7449046

src/pkg/syscall/passfd_test.go
src/pkg/syscall/syscall_bsd.go

index 079c9303ba582fb8b8fedde2a9a8531e4508d4e6..a0e590950755fc8f3b7866ddf42b394c87c8629f 100644 (file)
@@ -13,7 +13,6 @@ import (
        "net"
        "os"
        "os/exec"
-       "runtime"
        "syscall"
        "testing"
        "time"
@@ -27,9 +26,6 @@ import (
 // "-test.run=^TestPassFD$" and an environment variable used to signal
 // that the test should become the child process instead.
 func TestPassFD(t *testing.T) {
-       if runtime.GOOS == "openbsd" {
-               t.Skip("issue 4956")
-       }
        if os.Getenv("GO_WANT_HELPER_PROCESS") == "1" {
                passFDChild()
                return
index a1e0d153f7ed8d8da70fa9a446c8c58dae495983..560409a26202af2a11c49e2b95b848fed5a64da4 100644 (file)
@@ -327,6 +327,11 @@ func Getsockname(fd int) (sa Sockaddr, err error) {
        if err = getsockname(fd, &rsa, &len); err != nil {
                return
        }
+       // TODO(jsing): Remove after OpenBSD 5.4 is released (see issue 3349).
+       if runtime.GOOS == "openbsd" && rsa.Addr.Family == AF_UNSPEC && rsa.Addr.Len == 0 {
+               rsa.Addr.Family = AF_UNIX
+               rsa.Addr.Len = SizeofSockaddrUnix
+       }
        return anyToSockaddr(&rsa)
 }