DnsProxyListener.cpp revision 7b984e3f7e724f8a3547a707210319f3d479f261
1007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick/* 2007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick * Copyright (C) 2010 The Android Open Source Project 3007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick * 4007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick * Licensed under the Apache License, Version 2.0 (the "License"); 5007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick * you may not use this file except in compliance with the License. 6007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick * You may obtain a copy of the License at 7007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick * 8007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick * http://www.apache.org/licenses/LICENSE-2.0 9007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick * 10007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick * Unless required by applicable law or agreed to in writing, software 11007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick * distributed under the License is distributed on an "AS IS" BASIS, 12007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick * See the License for the specific language governing permissions and 14007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick * limitations under the License. 15007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick */ 16007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 17007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick#include <arpa/inet.h> 18007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick#include <dirent.h> 19007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick#include <errno.h> 20007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick#include <linux/if.h> 21007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick#include <netdb.h> 22007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick#include <netinet/in.h> 23007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick#include <stdlib.h> 24007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick#include <sys/socket.h> 25007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick#include <sys/types.h> 26ff2c0d8c13457e43f0d4bf06d3177271aac104c1Olivier Bailly#include <string.h> 27007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 28007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick#define LOG_TAG "DnsProxyListener" 29007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick#define DBG 0 30007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 31007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick#include <cutils/log.h> 32007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick#include <sysutils/SocketClient.h> 33007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 34007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick#include "DnsProxyListener.h" 35007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 36007e987fee7e815e0c4bc820f434a632b7a69a9dBrad FitzpatrickDnsProxyListener::DnsProxyListener() : 37007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick FrameworkListener("dnsproxyd") { 38007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick registerCmd(new GetAddrInfoCmd()); 391dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk registerCmd(new GetHostByAddrCmd()); 40007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 41007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 42007e987fee7e815e0c4bc820f434a632b7a69a9dBrad FitzpatrickDnsProxyListener::GetAddrInfoHandler::~GetAddrInfoHandler() { 43007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick free(mHost); 44007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick free(mService); 45007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick free(mHints); 46007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 47007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 48007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrickvoid DnsProxyListener::GetAddrInfoHandler::start() { 49007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick pthread_create(&mThread, NULL, 50007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick DnsProxyListener::GetAddrInfoHandler::threadStart, this); 51007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 52007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 53007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrickvoid* DnsProxyListener::GetAddrInfoHandler::threadStart(void* obj) { 54007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick GetAddrInfoHandler* handler = reinterpret_cast<GetAddrInfoHandler*>(obj); 55007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick handler->run(); 56007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick delete handler; 57007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick pthread_exit(NULL); 58007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick return NULL; 59007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 60007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 61007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick// Sends 4 bytes of big-endian length, followed by the data. 62007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick// Returns true on success. 63007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrickstatic bool sendLenAndData(SocketClient *c, const int len, const void* data) { 64007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick uint32_t len_be = htonl(len); 65e6a3a58d6aa4b551e38e1e19fdfea2c0d2841b85Brad Fitzpatrick return c->sendData(&len_be, 4) == 0 && 66e6a3a58d6aa4b551e38e1e19fdfea2c0d2841b85Brad Fitzpatrick (len == 0 || c->sendData(data, len) == 0); 67007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 68007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 69007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrickvoid DnsProxyListener::GetAddrInfoHandler::run() { 70007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick if (DBG) { 717b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("GetAddrInfoHandler, now for %s / %s", mHost, mService); 72007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 73007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 74007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick struct addrinfo* result = NULL; 75007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick int rv = getaddrinfo(mHost, mService, mHints, &result); 766c798fbf4e89c4058f046a65ee4f9aa5647e43e1Brad Fitzpatrick bool success = (mClient->sendData(&rv, sizeof(rv)) == 0); 77007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick if (rv == 0) { 78007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick struct addrinfo* ai = result; 79007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick while (ai && success) { 80007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick success = sendLenAndData(mClient, sizeof(struct addrinfo), ai) 81007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick && sendLenAndData(mClient, ai->ai_addrlen, ai->ai_addr) 82007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick && sendLenAndData(mClient, 83007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick ai->ai_canonname ? strlen(ai->ai_canonname) + 1 : 0, 84007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick ai->ai_canonname); 85007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick ai = ai->ai_next; 86007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 87007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick success = success && sendLenAndData(mClient, 0, ""); 88007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 89007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick if (result) { 90007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick freeaddrinfo(result); 91007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 92007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick if (!success) { 93007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick LOGW("Error writing DNS result to client"); 94007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 9534ffd85aed3838d53bd1136c751a7825de1940e0Brad Fitzpatrick mClient->decRef(); 96007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 97007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 98007e987fee7e815e0c4bc820f434a632b7a69a9dBrad FitzpatrickDnsProxyListener::GetAddrInfoCmd::GetAddrInfoCmd() : 99007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick NetdCommand("getaddrinfo") { 100007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 101007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 102007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrickint DnsProxyListener::GetAddrInfoCmd::runCommand(SocketClient *cli, 103007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick int argc, char **argv) { 1040475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom if (DBG) { 1050475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom for (int i = 0; i < argc; i++) { 1067b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("argv[%i]=%s", i, argv[i]); 1070475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom } 1080475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom } 109007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick if (argc != 7) { 1100475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom LOGW("Invalid number of arguments to getaddrinfo: %i", argc); 1110475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom sendLenAndData(cli, 0, NULL); 1120475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom return -1; 113007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 114007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 115007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick char* name = argv[1]; 116007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick if (strcmp("^", name) == 0) { 117007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick name = NULL; 118007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } else { 119007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick name = strdup(name); 120007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 121007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 122007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick char* service = argv[2]; 123007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick if (strcmp("^", service) == 0) { 124007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick service = NULL; 125007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } else { 126007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick service = strdup(service); 127007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 128007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 129007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick struct addrinfo* hints = NULL; 130007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick int ai_flags = atoi(argv[3]); 131007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick int ai_family = atoi(argv[4]); 132007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick int ai_socktype = atoi(argv[5]); 133007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick int ai_protocol = atoi(argv[6]); 134007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick if (ai_flags != -1 || ai_family != -1 || 135007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick ai_socktype != -1 || ai_protocol != -1) { 136007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick hints = (struct addrinfo*) calloc(1, sizeof(struct addrinfo)); 137007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick hints->ai_flags = ai_flags; 138007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick hints->ai_family = ai_family; 139007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick hints->ai_socktype = ai_socktype; 140007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick hints->ai_protocol = ai_protocol; 141007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 142007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 143007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick if (DBG) { 1447b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("GetAddrInfoHandler for %s / %s", 145007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick name ? name : "[nullhost]", 146007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick service ? service : "[nullservice]"); 147007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 148007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 14934ffd85aed3838d53bd1136c751a7825de1940e0Brad Fitzpatrick cli->incRef(); 150007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick DnsProxyListener::GetAddrInfoHandler* handler = 151007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick new DnsProxyListener::GetAddrInfoHandler(cli, name, service, hints); 152007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick handler->start(); 153007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 154007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick return 0; 155007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 1561dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 1571dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk/******************************************************* 1581dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk * GetHostByAddr * 1591dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk *******************************************************/ 1601dbd6cf148ea3fab57ec0644c336e94c78a488beMattias FalkDnsProxyListener::GetHostByAddrCmd::GetHostByAddrCmd() : 1611dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk NetdCommand("gethostbyaddr") { 1621dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk} 1631dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 1641dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falkint DnsProxyListener::GetHostByAddrCmd::runCommand(SocketClient *cli, 1651dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk int argc, char **argv) { 1660475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom if (DBG) { 1670475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom for (int i = 0; i < argc; i++) { 1687b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("argv[%i]=%s", i, argv[i]); 1690475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom } 1700475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom } 1711dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk if (argc != 4) { 1720475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom LOGW("Invalid number of arguments to gethostbyaddr: %i", argc); 1730475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom sendLenAndData(cli, 0, NULL); 1740475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom return -1; 1751dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk } 1761dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 1770475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom char* addrStr = argv[1]; 1781dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk int addrLen = atoi(argv[2]); 1791dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk int addrFamily = atoi(argv[3]); 1801dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 1810475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom void* addr = malloc(sizeof(struct in6_addr)); 1820475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom errno = 0; 1830475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom int result = inet_pton(addrFamily, addrStr, addr); 1840475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom if (result <= 0) { 1850475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom LOGW("inet_pton(\"%s\") failed %s", addrStr, strerror(errno)); 1860475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom free(addr); 1870475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom sendLenAndData(cli, 0, NULL); 1880475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom return -1; 1890475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom } 1900475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom 19134ffd85aed3838d53bd1136c751a7825de1940e0Brad Fitzpatrick cli->incRef(); 1921dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk DnsProxyListener::GetHostByAddrHandler* handler = 1931dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk new DnsProxyListener::GetHostByAddrHandler(cli, addr, addrLen, addrFamily); 1941dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk handler->start(); 1951dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 1961dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk return 0; 1971dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk} 1981dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 1991dbd6cf148ea3fab57ec0644c336e94c78a488beMattias FalkDnsProxyListener::GetHostByAddrHandler::~GetHostByAddrHandler() { 2001dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk free(mAddress); 2011dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk} 2021dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 2031dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falkvoid DnsProxyListener::GetHostByAddrHandler::start() { 2041dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk pthread_create(&mThread, NULL, 2051dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk DnsProxyListener::GetHostByAddrHandler::threadStart, this); 2061dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk} 2071dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 2081dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falkvoid* DnsProxyListener::GetHostByAddrHandler::threadStart(void* obj) { 2091dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk GetHostByAddrHandler* handler = reinterpret_cast<GetHostByAddrHandler*>(obj); 2101dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk handler->run(); 2111dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk delete handler; 2121dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk pthread_exit(NULL); 2131dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk return NULL; 2141dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk} 2151dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 2161dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falkvoid DnsProxyListener::GetHostByAddrHandler::run() { 2171dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk if (DBG) { 2187b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("DnsProxyListener::GetHostByAddrHandler::run\n"); 2191dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk } 2201dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 2211dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk struct hostent* hp; 2221dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 2230475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom // NOTE gethostbyaddr should take a void* but bionic thinks it should be char* 2240475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom hp = gethostbyaddr((char*)mAddress, mAddressLen, mAddressFamily); 2251dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 2261dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk if (DBG) { 2277b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("GetHostByAddrHandler::run gethostbyaddr errno: %s hp->h_name = %s, name_len = %d\n", 2281dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk hp ? "success" : strerror(errno), 2291dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk (hp && hp->h_name) ? hp->h_name: "null", 2301dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk (hp && hp->h_name) ? strlen(hp->h_name)+ 1 : 0); 2311dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk } 2321dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 2331dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk bool success = sendLenAndData(mClient, (hp && hp->h_name) ? strlen(hp->h_name)+ 1 : 0, 2341dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk (hp && hp->h_name) ? hp->h_name : ""); 2351dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 2361dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk if (!success) { 2371dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk LOGW("GetHostByAddrHandler: Error writing DNS result to client\n"); 2381dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk } 23934ffd85aed3838d53bd1136c751a7825de1940e0Brad Fitzpatrick mClient->decRef(); 2401dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk} 241