//go:build !plan9 package reuseport import ( "net" "syscall" ) // reuseErrShouldRetry diagnoses whether to retry after a reuse error. // if we failed to bind, we should retry. if bind worked and this is a // real dial error (remote end didnt answer) then we should not retry. func reuseErrShouldRetry(err error) bool { if err == nil { return false // hey, it worked! no need to retry. } // if it's a network timeout error, it's a legitimate failure. if nerr, ok := err.(net.Error); ok && nerr.Timeout() { return false } errno, ok := err.(syscall.Errno) if !ok { // not an errno? who knows what this is. retry. return true } switch errno { case syscall.EADDRINUSE, syscall.EADDRNOTAVAIL: return true // failure to bind. retry. case syscall.ECONNREFUSED: return false // real dial error default: return true // optimistically default to retry. } }