net: Only use GNU/Linux unix socket abstract paths on GNU/Linux.
authorIan Lance Taylor <ian@gcc.gnu.org>
Wed, 24 Jul 2013 16:53:17 +0000 (16:53 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Wed, 24 Jul 2013 16:53:17 +0000 (16:53 +0000)
From-SVN: r201217

libgo/go/syscall/socket.go
libgo/go/syscall/socket_bsd.go
libgo/go/syscall/socket_irix.go
libgo/go/syscall/socket_linux.go
libgo/go/syscall/socket_solaris.go

index cf0c08ebbf815f7eb07298dd17b5c02e2ef9b172..cc98d6b79fd57dc94d327bc9735e2ddca4d9f43b 100644 (file)
@@ -92,11 +92,7 @@ func (sa *SockaddrUnix) sockaddr() (*RawSockaddrAny, Socklen_t, error) {
        if n > 0 {
                sl += Socklen_t(n) + 1
        }
-       if sa.raw.Path[0] == '@' {
-               sa.raw.Path[0] = 0
-               // Don't count trailing NUL for abstract address.
-               sl--
-       }
+       sl = sa.raw.adjustAbstract(sl)
 
        // length is family (uint16), name, NUL.
        return (*RawSockaddrAny)(unsafe.Pointer(&sa.raw)), sl, nil
index be55991595164c4fa2037827191e3ce8f0a9c31e..72d7180b6ed03a2191e6f0d4719e0952e6783916 100644 (file)
@@ -11,11 +11,11 @@ const SizeofSockaddrInet6 = 28
 const SizeofSockaddrUnix = 110
 
 type RawSockaddrInet4 struct {
-       Len uint8;
-       Family uint8;
-       Port uint16;
-       Addr [4]byte /* in_addr */;
-       Zero [8]uint8;
+       Len    uint8
+       Family uint8
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       Zero   [8]uint8
 }
 
 func (sa *RawSockaddrInet4) setLen() Socklen_t {
@@ -24,12 +24,12 @@ func (sa *RawSockaddrInet4) setLen() Socklen_t {
 }
 
 type RawSockaddrInet6 struct {
-       Len uint8;
-       Family uint8;
-       Port uint16;
-       Flowinfo uint32;
-       Addr [16]byte /* in6_addr */;
-       Scope_id uint32;
+       Len      uint8
+       Family   uint8
+       Port     uint16
+       Flowinfo uint32
+       Addr     [16]byte /* in6_addr */
+       Scope_id uint32
 }
 
 func (sa *RawSockaddrInet6) setLen() Socklen_t {
@@ -38,9 +38,9 @@ func (sa *RawSockaddrInet6) setLen() Socklen_t {
 }
 
 type RawSockaddrUnix struct {
-       Len uint8;
-       Family uint8;
-       Path [108]int8;
+       Len    uint8
+       Family uint8
+       Path   [108]int8
 }
 
 func (sa *RawSockaddrUnix) setLen(n int) {
@@ -62,10 +62,14 @@ func (sa *RawSockaddrUnix) getLen() (int, error) {
        return n, nil
 }
 
+func (sa *RawSockaddrUnix) adjustAbstract(sl Socklen_t) Socklen_t {
+       return sl
+}
+
 type RawSockaddr struct {
-       Len uint8;
-       Family uint8;
-       Data [14]int8;
+       Len    uint8
+       Family uint8
+       Data   [14]int8
 }
 
 // BindToDevice binds the socket associated with fd to device.
index 289769b6d3fcf0675ddf393eef29f68f468ed8b0..bcd1781d570e5f7f61530527491ac6f3efde3d5d 100644 (file)
@@ -64,6 +64,10 @@ func (sa *RawSockaddrUnix) getLen() (int, error) {
        return n, nil
 }
 
+func (sa *RawSockaddrUnix) adjustAbstract(sl Socklen_t) Socklen_t {
+       return sl
+}
+
 type RawSockaddr struct {
        Family uint16
        Data   [14]int8
index 49a1625d08dc0ad37b84474acebd5060d1950d86..8546abc3e062d23949e9066aa469b1adeb4b6a94 100644 (file)
@@ -110,6 +110,15 @@ func (sa *RawSockaddrUnix) getLen() (int, error) {
        return n, nil
 }
 
+func (sa *RawSockaddrUnix) adjustAbstract(sl Socklen_t) Socklen_t {
+       if sa.Path[0] == '@' {
+               sa.Path[0] = 0
+               // Don't count trailing NUL for abstract address.
+               sl--
+       }
+       return sl
+}
+
 type RawSockaddrLinklayer struct {
        Family   uint16
        Protocol uint16
index 0a03465a3388821217b7378fae836a55ca241369..39588892f2b5825509a4408fba238e89b51470f9 100644 (file)
@@ -12,9 +12,9 @@ const SizeofSockaddrUnix = 110
 
 type RawSockaddrInet4 struct {
        Family uint16
-       Port uint16
-       Addr [4]byte /* in_addr */
-       Zero [8]uint8
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       Zero   [8]uint8
 }
 
 func (sa *RawSockaddrInet4) setLen() Socklen_t {
@@ -22,12 +22,12 @@ func (sa *RawSockaddrInet4) setLen() Socklen_t {
 }
 
 type RawSockaddrInet6 struct {
-       Family uint16
-       Port uint16
+       Family   uint16
+       Port     uint16
        Flowinfo uint32
-       Addr [16]byte /* in6_addr */
+       Addr     [16]byte /* in6_addr */
        Scope_id uint32
-       Src_id uint32
+       Src_id   uint32
 }
 
 func (sa *RawSockaddrInet6) setLen() Socklen_t {
@@ -36,38 +36,27 @@ func (sa *RawSockaddrInet6) setLen() Socklen_t {
 
 type RawSockaddrUnix struct {
        Family uint16
-       Path [108]int8
+       Path   [108]int8
 }
 
 func (sa *RawSockaddrUnix) setLen(int) {
 }
 
 func (sa *RawSockaddrUnix) getLen() (int, error) {
-       if sa.Path[0] == 0 {
-               // "Abstract" Unix domain socket.
-               // Rewrite leading NUL as @ for textual display.
-               // (This is the standard convention.)
-               // Not friendly to overwrite in place,
-               // but the callers below don't care.
-               sa.Path[0] = '@'
-       }
-
-       // Assume path ends at NUL.
-       // This is not technically the GNU/Linux semantics for
-       // abstract Unix domain sockets--they are supposed
-       // to be uninterpreted fixed-size binary blobs--but
-       // everyone uses this convention.
        n := 0
-       for n < len(sa.Path) - 3 && sa.Path[n] != 0 {
+       for n < len(sa.Path) && sa.Path[n] != 0 {
                n++
        }
-
        return n, nil
 }
 
+func (sa *RawSockaddrUnix) adjustAbstract(sl Socklen_t) Socklen_t {
+       return sl
+}
+
 type RawSockaddr struct {
        Family uint16
-       Data [14]int8
+       Data   [14]int8
 }
 
 // BindToDevice binds the socket associated with fd to device.