diff --git a/src/net/file_unix.go b/src/net/file_unix.go index 5b24c7d09d..9e581fcb41 100644 --- a/src/net/file_unix.go +++ b/src/net/file_unix.go @@ -91,7 +91,7 @@ func fileListener(f *os.File) (Listener, error) { case *TCPAddr: return &TCPListener{fd}, nil case *UnixAddr: - return &UnixListener{fd, laddr.Name}, nil + return &UnixListener{fd: fd, path: laddr.Name, unlink: false}, nil } fd.Close() return nil, syscall.EINVAL diff --git a/src/net/unixsock_posix.go b/src/net/unixsock_posix.go index 351d9b3a39..fc44c1a458 100644 --- a/src/net/unixsock_posix.go +++ b/src/net/unixsock_posix.go @@ -273,8 +273,9 @@ func dialUnix(net string, laddr, raddr *UnixAddr, deadline time.Time) (*UnixConn // typically use variables of type Listener instead of assuming Unix // domain sockets. type UnixListener struct { - fd *netFD - path string + fd *netFD + path string + unlink bool } // ListenUnix announces on the Unix domain socket laddr and returns a @@ -292,7 +293,7 @@ func ListenUnix(net string, laddr *UnixAddr) (*UnixListener, error) { if err != nil { return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr.opAddr(), Err: err} } - return &UnixListener{fd: fd, path: fd.laddr.String()}, nil + return &UnixListener{fd: fd, path: fd.laddr.String(), unlink: true}, nil } // AcceptUnix accepts the next incoming call and returns the new @@ -335,7 +336,7 @@ func (l *UnixListener) Close() error { // is at least compatible with the auto-remove // sequence in ListenUnix. It's only non-Go // programs that can mess us up. - if l.path[0] != '@' { + if l.path[0] != '@' && l.unlink { syscall.Unlink(l.path) } err := l.fd.Close()