EAI_AGAIN = 2
EAI_NODATA = 7
EAI_NONAME = 8
+ EAI_SERVICE = 9
EAI_SYSTEM = 11
EAI_OVERFLOW = 14
if err == nil { // see golang.org/issue/6232
err = syscall.EMFILE
}
+ case _C_EAI_SERVICE, _C_EAI_NONAME: // Darwin returns EAI_NONAME.
+ return 0, &DNSError{Err: "unknown port", Name: network + "/" + service, IsNotFound: true}
default:
err = addrinfoErrno(gerrno)
isTemporary = addrinfoErrno(gerrno).Temporary()
return int(p[0])<<8 | int(p[1]), nil
}
}
- return 0, &DNSError{Err: "unknown port", Name: network + "/" + service}
+ return 0, &DNSError{Err: "unknown port", Name: network + "/" + service, IsNotFound: true}
}
func cgoLookupHostIP(network, name string) (addrs []IPAddr, err error) {
_C_EAI_AGAIN = C.EAI_AGAIN
_C_EAI_NODATA = C.EAI_NODATA
_C_EAI_NONAME = C.EAI_NONAME
+ _C_EAI_SERVICE = C.EAI_SERVICE
_C_EAI_OVERFLOW = C.EAI_OVERFLOW
_C_EAI_SYSTEM = C.EAI_SYSTEM
_C_IPPROTO_TCP = C.IPPROTO_TCP
_C_AF_UNSPEC = syscall.AF_UNSPEC
_C_EAI_AGAIN = unix.EAI_AGAIN
_C_EAI_NONAME = unix.EAI_NONAME
+ _C_EAI_SERVICE = unix.EAI_SERVICE
_C_EAI_NODATA = unix.EAI_NODATA
_C_EAI_OVERFLOW = unix.EAI_OVERFLOW
_C_EAI_SYSTEM = unix.EAI_SYSTEM
if port, ok := m[string(lowerService[:n])]; ok && n == len(service) {
return port, nil
}
+ return 0, &DNSError{Err: "unknown port", Name: network + "/" + service, IsNotFound: true}
}
- return 0, &AddrError{Err: "unknown port", Addr: network + "/" + service}
+ return 0, &DNSError{Err: "unknown network", Name: network + "/" + service}
}
// ipVersion returns the provided network's IP version: '4', '6' or 0
}
lines, err := queryCS(ctx, network, "127.0.0.1", toLower(service))
if err != nil {
+ if stringsHasSuffix(err.Error(), "can't translate service") {
+ return 0, &DNSError{Err: "unknown port", Name: network + "/" + service, IsNotFound: true}
+ }
return
}
- unknownPortError := &AddrError{Err: "unknown port", Addr: network + "/" + service}
if len(lines) == 0 {
- return 0, unknownPortError
+ return 0, &DNSError{Err: "unknown port", Name: network + "/" + service, IsNotFound: true}
}
f := getFields(lines[0])
if len(f) < 2 {
- return 0, unknownPortError
+ return 0, &DNSError{Err: "unknown port", Name: network + "/" + service, IsNotFound: true}
}
s := f[1]
if i := bytealg.IndexByteString(s, '!'); i >= 0 {
if n, _, ok := dtoi(s); ok {
return n, nil
}
- return 0, unknownPortError
+ return 0, &DNSError{Err: "unknown port", Name: network + "/" + service, IsNotFound: true}
}
func (r *Resolver) lookupCNAME(ctx context.Context, name string) (cname string, err error) {
return
}
}
+
+func TestLookupPortNotFound(t *testing.T) {
+ _, err := LookupPort("udp", "_-unknown-service-")
+ var dnsErr *DNSError
+ if !errors.As(err, &dnsErr) || !dnsErr.IsNotFound {
+ t.Fatalf("unexpected error: %v", err)
+ }
+}
const (
_WSAHOST_NOT_FOUND = syscall.Errno(11001)
_WSATRY_AGAIN = syscall.Errno(11002)
+ _WSATYPE_NOT_FOUND = syscall.Errno(10109)
)
func winError(call string, err error) error {
if port, err := lookupPortMap(network, service); err == nil {
return port, nil
}
- err := winError("getaddrinfow", e)
- dnsError := &DNSError{Err: err.Error(), Name: network + "/" + service}
- if err == errNoSuchHost {
- dnsError.IsNotFound = true
+
+ // The _WSATYPE_NOT_FOUND error is returned by GetAddrInfoW
+ // when the service name is unknown. We are also checking
+ // for _WSAHOST_NOT_FOUND here to match the cgo (unix) version
+ // cgo_unix.go (cgoLookupServicePort).
+ if e == _WSATYPE_NOT_FOUND || e == _WSAHOST_NOT_FOUND {
+ return 0, &DNSError{Err: "unknown port", Name: network + "/" + service, IsNotFound: true}
}
- return 0, dnsError
+ err := os.NewSyscallError("getaddrinfow", e)
+ return 0, &DNSError{Err: err.Error(), Name: network + "/" + service}
}
defer syscall.FreeAddrInfoW(result)
if result == nil {