From ced7238a6597039fb23f36f372bd1cf33d60d4a6 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Thu, 25 Apr 2019 17:23:42 +0200 Subject: [PATCH] net: set DNSError.IsTemorary from addrinfoErrno errors DNSErrors that are created via addrinfoErrno(...) currently do not have the "IsTemporary" set. However the addrinfoErrno type itself has the Temporary() property. This PR sets DNSError.IsTemporary to the addrinfoErrno.Temporary value. This is useful to e.g. detect if a DNSError is of type EAI_AGAIN (which is currently not possible AFAICT). --- src/net/cgo_unix.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/net/cgo_unix.go b/src/net/cgo_unix.go index 2baab5f1933..69c99fe7dbb 100644 --- a/src/net/cgo_unix.go +++ b/src/net/cgo_unix.go @@ -106,6 +106,7 @@ func cgoLookupServicePort(hints *C.struct_addrinfo, network, service string) (po var res *C.struct_addrinfo gerrno, err := C.getaddrinfo(nil, (*C.char)(unsafe.Pointer(&cservice[0])), hints, &res) if gerrno != 0 { + isTemporary := false switch gerrno { case C.EAI_SYSTEM: if err == nil { // see golang.org/issue/6232 @@ -113,8 +114,9 @@ func cgoLookupServicePort(hints *C.struct_addrinfo, network, service string) (po } default: err = addrinfoErrno(gerrno) + isTemporary = addrinfoErrno(gerrno).Temporary() } - return 0, &DNSError{Err: err.Error(), Name: network + "/" + service} + return 0, &DNSError{Err: err.Error(), Name: network + "/" + service, IsTemporary: isTemporary} } defer C.freeaddrinfo(res) @@ -159,6 +161,7 @@ func cgoLookupIPCNAME(network, name string) (addrs []IPAddr, cname string, err e gerrno, err := C.getaddrinfo((*C.char)(unsafe.Pointer(&h[0])), nil, &hints, &res) if gerrno != 0 { isErrorNoSuchHost := false + isTemporary := false switch gerrno { case C.EAI_SYSTEM: if err == nil { @@ -176,9 +179,10 @@ func cgoLookupIPCNAME(network, name string) (addrs []IPAddr, cname string, err e isErrorNoSuchHost = true default: err = addrinfoErrno(gerrno) + isTemporary = addrinfoErrno(gerrno).Temporary() } - return nil, "", &DNSError{Err: err.Error(), Name: name, IsNotFound: isErrorNoSuchHost} + return nil, "", &DNSError{Err: err.Error(), Name: name, IsNotFound: isErrorNoSuchHost, IsTemporary: isTemporary} } defer C.freeaddrinfo(res) @@ -299,6 +303,7 @@ func cgoLookupAddrPTR(addr string, sa *C.struct_sockaddr, salen C.socklen_t) (na } } if gerrno != 0 { + isTemporary := false switch gerrno { case C.EAI_SYSTEM: if err == nil { // see golang.org/issue/6232 @@ -306,8 +311,9 @@ func cgoLookupAddrPTR(addr string, sa *C.struct_sockaddr, salen C.socklen_t) (na } default: err = addrinfoErrno(gerrno) + isTemporary = addrinfoErrno(gerrno).Temporary() } - return nil, &DNSError{Err: err.Error(), Name: addr} + return nil, &DNSError{Err: err.Error(), Name: addr, IsTemporary: isTemporary} } for i := 0; i < len(b); i++ { if b[i] == 0 {