Search in sources :

Example 6 with GaiException

use of libcore.io.GaiException in project XobotOS by xamarin.

the class InetAddress method lookupHostByName.

/**
     * Resolves a hostname to its IP addresses using a cache.
     *
     * @param host the hostname to resolve.
     * @return the IP addresses of the host.
     */
private static InetAddress[] lookupHostByName(String host) throws UnknownHostException {
    BlockGuard.getThreadPolicy().onNetwork();
    // Do we have a result cached?
    Object cachedResult = addressCache.get(host);
    if (cachedResult != null) {
        if (cachedResult instanceof InetAddress[]) {
            // A cached positive result.
            return (InetAddress[]) cachedResult;
        } else {
            // A cached negative result.
            throw new UnknownHostException((String) cachedResult);
        }
    }
    try {
        StructAddrinfo hints = new StructAddrinfo();
        hints.ai_flags = AI_ADDRCONFIG;
        hints.ai_family = AF_UNSPEC;
        // If we don't specify a socket type, every address will appear twice, once
        // for SOCK_STREAM and one for SOCK_DGRAM. Since we do not return the family
        // anyway, just pick one.
        hints.ai_socktype = SOCK_STREAM;
        InetAddress[] addresses = Libcore.os.getaddrinfo(host, hints);
        // TODO: should getaddrinfo set the hostname of the InetAddresses it returns?
        for (InetAddress address : addresses) {
            address.hostName = host;
        }
        addressCache.put(host, addresses);
        return addresses;
    } catch (GaiException gaiException) {
        // TODO: bionic currently returns EAI_NODATA, which is indistinguishable from a real
        // failure. We need to fix bionic before we can report a more useful error.
        // if (gaiException.error == EAI_SYSTEM) {
        //    throw new SecurityException("Permission denied (missing INTERNET permission?)");
        // }
        String detailMessage = "Unable to resolve host \"" + host + "\": " + Libcore.os.gai_strerror(gaiException.error);
        addressCache.putUnknownHost(host, detailMessage);
        throw gaiException.rethrowAsUnknownHostException(detailMessage);
    }
}
Also used : StructAddrinfo(libcore.io.StructAddrinfo) GaiException(libcore.io.GaiException)

Aggregations

GaiException (libcore.io.GaiException)6 StructAddrinfo (libcore.io.StructAddrinfo)6 ErrnoException (libcore.io.ErrnoException)2