package net
-import "syscall"
+import (
+ "os"
+ "syscall"
+ "testing"
+)
var (
errTimedout = syscall.ETIMEDOUT
_, ok := err.(syscall.Errno)
return ok
}
+
+func TestSpuriousENOTAVAIL(t *testing.T) {
+ for _, tt := range []struct {
+ error
+ ok bool
+ }{
+ {syscall.EADDRNOTAVAIL, true},
+ {&os.SyscallError{Syscall: "syscall", Err: syscall.EADDRNOTAVAIL}, true},
+ {&OpError{Op: "op", Err: syscall.EADDRNOTAVAIL}, true},
+ {&OpError{Op: "op", Err: &os.SyscallError{Syscall: "syscall", Err: syscall.EADDRNOTAVAIL}}, true},
+
+ {syscall.EINVAL, false},
+ {&os.SyscallError{Syscall: "syscall", Err: syscall.EINVAL}, false},
+ {&OpError{Op: "op", Err: syscall.EINVAL}, false},
+ {&OpError{Op: "op", Err: &os.SyscallError{Syscall: "syscall", Err: syscall.EINVAL}}, false},
+ } {
+ if ok := spuriousENOTAVAIL(tt.error); ok != tt.ok {
+ t.Errorf("spuriousENOTAVAIL(%v) = %v; want %v", tt.error, ok, tt.ok)
+ }
+ }
+}
}
func spuriousENOTAVAIL(err error) bool {
- e, ok := err.(*OpError)
- return ok && e.Err == syscall.EADDRNOTAVAIL
+ if op, ok := err.(*OpError); ok {
+ err = op.Err
+ }
+ if sys, ok := err.(*os.SyscallError); ok {
+ err = sys.Err
+ }
+ return err == syscall.EADDRNOTAVAIL
}
// TCPListener is a TCP network listener. Clients should typically