]> Cypherpunks repositories - gostls13.git/commitdiff
net: make LocalAddr on multicast return group address
authorMikio Hara <mikioh.mikioh@gmail.com>
Sun, 19 Feb 2012 01:50:03 +0000 (10:50 +0900)
committerMikio Hara <mikioh.mikioh@gmail.com>
Sun, 19 Feb 2012 01:50:03 +0000 (10:50 +0900)
Fixes #3067.

R=golang-dev, rsc, rsc
CC=golang-dev
https://golang.org/cl/5656098

src/pkg/net/multicast_test.go
src/pkg/net/sock.go
src/pkg/net/udpsock_posix.go

index f62580de66e9e8e7259209e5d1df40caecdfcee9..9727ecdc1584ba6ff6c6b5c5553be451dd504328 100644 (file)
@@ -81,6 +81,9 @@ func TestListenMulticastUDP(t *testing.T) {
                if !found {
                        t.Fatalf("%q not found in RIB", tt.gaddr.String())
                }
+               if c.LocalAddr().String() != tt.gaddr.String() {
+                       t.Fatalf("LocalAddr returns %q, expected %q", c.LocalAddr().String(), tt.gaddr.String())
+               }
        }
 }
 
@@ -114,6 +117,9 @@ func TestSimpleListenMulticastUDP(t *testing.T) {
                if err != nil {
                        t.Fatalf("ListenMulticastUDP failed: %v", err)
                }
+               if c.LocalAddr().String() != tt.gaddr.String() {
+                       t.Fatalf("LocalAddr returns %q, expected %q", c.LocalAddr().String(), tt.gaddr.String())
+               }
                c.Close()
        }
 }
index 70064c307ef36b5319d3a341c5829ecf318325b7..dc139f04a259e34fc99a4e8246a2df0c2443b309 100644 (file)
@@ -33,13 +33,14 @@ func socket(net string, f, t, p int, la, ra syscall.Sockaddr, toAddr func(syscal
                return nil, err
        }
 
+       var bla syscall.Sockaddr
        if la != nil {
-               la, err = listenerSockaddr(s, f, la, toAddr)
+               bla, err = listenerSockaddr(s, f, la, toAddr)
                if err != nil {
                        closesocket(s)
                        return nil, err
                }
-               err = syscall.Bind(s, la)
+               err = syscall.Bind(s, bla)
                if err != nil {
                        closesocket(s)
                        return nil, err
@@ -61,7 +62,12 @@ func socket(net string, f, t, p int, la, ra syscall.Sockaddr, toAddr func(syscal
        }
 
        sa, _ := syscall.Getsockname(s)
-       laddr := toAddr(sa)
+       var laddr Addr
+       if la != nil && bla != la {
+               laddr = toAddr(la)
+       } else {
+               laddr = toAddr(sa)
+       }
        sa, _ = syscall.Getpeername(s)
        raddr := toAddr(sa)
 
index 8ee58ed4c6e500ff5fd92d701277debcaa70d902..1f99dc53867826cfc29b61fd12569a7b5b507a3e 100644 (file)
@@ -262,7 +262,7 @@ func ListenMulticastUDP(net string, ifi *Interface, gaddr *UDPAddr) (*UDPConn, e
                return nil, UnknownNetworkError(net)
        }
        if gaddr == nil || gaddr.IP == nil {
-               return nil, &OpError{"listenmulticastudp", "udp", nil, errMissingAddress}
+               return nil, &OpError{"listenmulticast", net, nil, errMissingAddress}
        }
        fd, err := internetSocket(net, gaddr.toAddr(), nil, syscall.SOCK_DGRAM, 0, "listen", sockaddrToUDP)
        if err != nil {