func doBlockingWithCtx[T any](ctx context.Context, lookupName string, blocking func() (T, error)) (T, error) {
if err := acquireThread(ctx); err != nil {
var zero T
- return zero, &DNSError{
- Name: lookupName,
- Err: mapErr(err).Error(),
- IsTimeout: err == context.DeadlineExceeded,
- }
+ return zero, newDNSError(mapErr(err), lookupName, "")
}
if ctx.Done() == nil {
return r.res, r.err
case <-ctx.Done():
var zero T
- return zero, &DNSError{
- Name: lookupName,
- Err: mapErr(ctx.Err()).Error(),
- IsTimeout: ctx.Err() == context.DeadlineExceeded,
- }
+ return zero, newDNSError(mapErr(ctx.Err()), lookupName, "")
}
}
"internal/itoa"
"io/fs"
"os"
+ "strconv"
"syscall"
)
clone, dest, err := queryCS1(ctx, proto, ip, port)
if err != nil {
+ err = handlePlan9DNSError(err, net+":"+ip.String()+":"+strconv.Itoa(port))
return
}
f, err := os.OpenFile(clone, os.O_RDWR, 0)
case r := <-ch:
return r.addrs, r.err
case <-ctx.Done():
- return nil, &DNSError{
- Name: query,
- Err: ctx.Err().Error(),
- IsTimeout: ctx.Err() == context.DeadlineExceeded,
- }
+ return nil, mapErr(err)
}
}
func lookupProtocol(ctx context.Context, name string) (proto int, err error) {
lines, err := query(ctx, netdir+"/cs", "!protocol="+toLower(name), 128)
if err != nil {
- return 0, err
+ return 0, newDNSError(err, name, "")
}
if len(lines) == 0 {
return 0, UnknownNetworkError(name)
lines, err := queryCS(ctx, network, "127.0.0.1", toLower(service))
if err != nil {
if stringslite.HasSuffix(err.Error(), "can't translate service") {
- return 0, &DNSError{Err: "unknown port", Name: errNetwork + "/" + service, IsNotFound: true}
+ return 0, newDNSError(errUnknownPort, errNetwork+"/"+service, "")
}
- return
+ return 0, newDNSError(err, errNetwork+"/"+service, "")
}
if len(lines) == 0 {
- return 0, &DNSError{Err: "unknown port", Name: errNetwork + "/" + service, IsNotFound: true}
+ return 0, newDNSError(errUnknownPort, errNetwork+"/"+service, "")
}
f := getFields(lines[0])
if len(f) < 2 {
- return 0, &DNSError{Err: "unknown port", Name: errNetwork + "/" + service, IsNotFound: true}
+ return 0, newDNSError(errUnknownPort, errNetwork+"/"+service, "")
}
s := f[1]
if i := bytealg.IndexByteString(s, '!'); i >= 0 {
if n, _, ok := dtoi(s); ok {
return n, nil
}
- return 0, &DNSError{Err: "unknown port", Name: errNetwork + "/" + service, IsNotFound: true}
+ return 0, newDNSError(errUnknownPort, errNetwork+"/"+service, "")
}
func (r *Resolver) lookupCNAME(ctx context.Context, name string) (cname string, err error) {
return f[2] + ".", nil
}
}
- return "", errors.New("bad response from ndb/dns")
+ return "", &DNSError{Err: "bad response from ndb/dns", Name: name}
}
func (r *Resolver) lookupSRV(ctx context.Context, service, proto, name string) (cname string, addrs []*SRV, err error) {
}
return r.proto, r.err
case <-ctx.Done():
- return 0, mapErr(ctx.Err())
+ return 0, newDNSError(mapErr(ctx.Err()), name, "")
}
}
getaddr := func() ([]IPAddr, error) {
if err := acquireThread(ctx); err != nil {
- return nil, &DNSError{
- Name: name,
- Err: mapErr(err).Error(),
- IsTimeout: ctx.Err() == context.DeadlineExceeded,
- }
+ return nil, newDNSError(mapErr(err), name, "")
}
defer releaseThread()
hints := syscall.AddrinfoW{
// TODO(bradfitz): finish ctx plumbing
if err := acquireThread(ctx); err != nil {
- return 0, &DNSError{
- Name: network + "/" + service,
- Err: mapErr(err).Error(),
- IsTimeout: ctx.Err() == context.DeadlineExceeded,
- }
+ return 0, newDNSError(mapErr(err), network+"/"+service, "")
}
defer releaseThread()
// TODO(bradfitz): finish ctx plumbing
if err := acquireThread(ctx); err != nil {
- return "", &DNSError{
- Name: name,
- Err: mapErr(err).Error(),
- IsTimeout: ctx.Err() == context.DeadlineExceeded,
- }
+ return "", newDNSError(mapErr(err), name, "")
}
defer releaseThread()
var rec *syscall.DNSRecord
}
// TODO(bradfitz): finish ctx plumbing
if err := acquireThread(ctx); err != nil {
- return "", nil, &DNSError{
- Name: name,
- Err: mapErr(err).Error(),
- IsTimeout: ctx.Err() == context.DeadlineExceeded,
- }
+ return "", nil, newDNSError(mapErr(err), name, "")
}
defer releaseThread()
var target string
}
// TODO(bradfitz): finish ctx plumbing.
if err := acquireThread(ctx); err != nil {
- return nil, &DNSError{
- Name: name,
- Err: mapErr(err).Error(),
- IsTimeout: ctx.Err() == context.DeadlineExceeded,
- }
+ return nil, newDNSError(mapErr(err), name, "")
}
defer releaseThread()
var rec *syscall.DNSRecord
}
// TODO(bradfitz): finish ctx plumbing.
if err := acquireThread(ctx); err != nil {
- return nil, &DNSError{
- Name: name,
- Err: mapErr(err).Error(),
- IsTimeout: ctx.Err() == context.DeadlineExceeded,
- }
+ return nil, newDNSError(mapErr(err), name, "")
}
defer releaseThread()
var rec *syscall.DNSRecord
}
// TODO(bradfitz): finish ctx plumbing.
if err := acquireThread(ctx); err != nil {
- return nil, &DNSError{
- Name: name,
- Err: mapErr(err).Error(),
- IsTimeout: ctx.Err() == context.DeadlineExceeded,
- }
+ return nil, newDNSError(mapErr(err), name, "")
}
defer releaseThread()
var rec *syscall.DNSRecord
// TODO(bradfitz): finish ctx plumbing.
if err := acquireThread(ctx); err != nil {
- return nil, &DNSError{
- Name: addr,
- Err: mapErr(err).Error(),
- IsTimeout: ctx.Err() == context.DeadlineExceeded,
- }
+ return nil, newDNSError(mapErr(err), addr, "")
}
defer releaseThread()
arpa, err := reverseaddr(addr)