cf6dbe48e0
This commit changes our system resolver to call getaddrinfo directly when CGO is enabled. This change allows us to: 1. obtain the CNAME easily 2. obtain the real getaddrinfo retval 3. handle platform specific oddities such as `EAI_NODATA` returned on Android devices See https://github.com/ooni/probe/issues/2029 and https://github.com/ooni/probe/issues/2029#issuecomment-1140258729 in particular. See https://github.com/ooni/probe/issues/2033 for documentation regarding the desire to see `getaddrinfo`'s retval. See https://github.com/ooni/probe/issues/2118 for possible follow-up changes.
57 lines
1.6 KiB
Go
57 lines
1.6 KiB
Go
package netxlite
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
)
|
|
|
|
// getaddrinfoLookupHost performs a DNS lookup and returns the
|
|
// results. If we were compiled with CGO_ENABLED=0, then this
|
|
// function calls net.DefaultResolver.LookupHost. Otherwise,
|
|
// we call getaddrinfo. In such a case, if getaddrinfo returns a nonzero
|
|
// return value, we'll return as error an instance of the
|
|
// ErrGetaddrinfo error. This error will contain the specific
|
|
// code returned by getaddrinfo in its .Code field.
|
|
func getaddrinfoLookupHost(ctx context.Context, domain string) ([]string, error) {
|
|
addrs, _, err := getaddrinfoLookupANY(ctx, domain)
|
|
return addrs, err
|
|
}
|
|
|
|
// ErrGetaddrinfo represents a getaddrinfo failure.
|
|
type ErrGetaddrinfo struct {
|
|
// Err is the error proper.
|
|
Underlying error
|
|
|
|
// Code is getaddrinfo's return code.
|
|
Code int64
|
|
}
|
|
|
|
// newErrGetaddrinfo creates a new instance of the ErrGetaddrinfo type.
|
|
func newErrGetaddrinfo(code int64, err error) *ErrGetaddrinfo {
|
|
return &ErrGetaddrinfo{
|
|
Underlying: err,
|
|
Code: code,
|
|
}
|
|
}
|
|
|
|
// Error returns the underlying error's string.
|
|
func (err *ErrGetaddrinfo) Error() string {
|
|
return err.Underlying.Error()
|
|
}
|
|
|
|
// Unwrap allows to get the underlying error value.
|
|
func (err *ErrGetaddrinfo) Unwrap() error {
|
|
return err.Underlying
|
|
}
|
|
|
|
// ErrorToGetaddrinfoRetval converts an arbitrary error to
|
|
// the return value of getaddrinfo. If err is nil or is not
|
|
// an instance of ErrGetaddrinfo, we just return zero.
|
|
func ErrorToGetaddrinfoRetval(err error) int64 {
|
|
var aierr *ErrGetaddrinfo
|
|
if err != nil && errors.As(err, &aierr) {
|
|
return aierr.Code
|
|
}
|
|
return 0
|
|
}
|