mirror of
https://github.com/dutchcoders/transfer.sh.git
synced 2025-01-15 21:20:19 +01:00
36 lines
732 B
Go
36 lines
732 B
Go
//+build darwin,go1.9
|
|
|
|
package nosigpipe
|
|
|
|
import (
|
|
"net"
|
|
"syscall"
|
|
|
|
"github.com/google/martian/log"
|
|
)
|
|
|
|
// IgnoreSIGPIPE prevents SIGPIPE from being raised on TCP sockets when remote hangs up
|
|
// See: https://github.com/golang/go/issues/17393
|
|
func IgnoreSIGPIPE(c net.Conn) {
|
|
if c == nil {
|
|
return
|
|
}
|
|
s, ok := c.(syscall.Conn)
|
|
if !ok {
|
|
return
|
|
}
|
|
r, e := s.SyscallConn()
|
|
if e != nil {
|
|
log.Errorf("Failed to get SyscallConn: %s", e)
|
|
return
|
|
}
|
|
e = r.Control(func(fd uintptr) {
|
|
intfd := int(fd)
|
|
if e := syscall.SetsockoptInt(intfd, syscall.SOL_SOCKET, syscall.SO_NOSIGPIPE, 1); e != nil {
|
|
log.Errorf("Failed to set SO_NOSIGPIPE: %s", e)
|
|
}
|
|
})
|
|
if e != nil {
|
|
log.Errorf("Failed to set SO_NOSIGPIPE: %s", e)
|
|
}
|
|
}
|