]> Cypherpunks repositories - gostls13.git/commitdiff
net: make spuriousENOTAVAIL to be able to parse EADDRNOTAVAIL correctly
authorMikio Hara <mikioh.mikioh@gmail.com>
Tue, 28 Jul 2015 03:28:09 +0000 (12:28 +0900)
committerMikio Hara <mikioh.mikioh@gmail.com>
Tue, 28 Jul 2015 11:52:56 +0000 (11:52 +0000)
Change-Id: I82e3aadbd18fccb98a76d1c36876510f5e1c3089
Reviewed-on: https://go-review.googlesource.com/12750
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/net/error_posix_test.go
src/net/tcpsock_posix.go

index a642e292270b8348a6233c8ddca9855b61d2da54..981cc837ba414a6bbf1bb286792db7c8efc2b825 100644 (file)
@@ -6,7 +6,11 @@
 
 package net
 
-import "syscall"
+import (
+       "os"
+       "syscall"
+       "testing"
+)
 
 var (
        errTimedout       = syscall.ETIMEDOUT
@@ -17,3 +21,24 @@ func isPlatformError(err error) bool {
        _, 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)
+               }
+       }
+}
index f3d5add6897947344e2ee8e700fef43794b1f253..7e49b769e1c98c841e3bfc4798db639d6b5bb9cf 100644 (file)
@@ -230,8 +230,13 @@ func selfConnect(fd *netFD, err error) bool {
 }
 
 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