Skip to content

Instantly share code, notes, and snippets.

@yyoshiki41
Created February 8, 2016 04:27
Show Gist options
  • Save yyoshiki41/bb9e950a4215b61d08a0 to your computer and use it in GitHub Desktop.
Save yyoshiki41/bb9e950a4215b61d08a0 to your computer and use it in GitHub Desktop.
diff --git src/net/file_unix.go src/net/file_unix.go
index 5b24c7d..9e581fc 100644
--- src/net/file_unix.go
+++ 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 src/net/unixsock_posix.go src/net/unixsock_posix.go
index 351d9b3..fc44c1a 100644
--- src/net/unixsock_posix.go
+++ 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()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment