DnsProxyListener.cpp revision ddb34755fb54882b3ece8d4919593e26a2c1cfcb
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" 35ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun#include "ResponseCode.h" 36007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 37007e987fee7e815e0c4bc820f434a632b7a69a9dBrad FitzpatrickDnsProxyListener::DnsProxyListener() : 38007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick FrameworkListener("dnsproxyd") { 39007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick registerCmd(new GetAddrInfoCmd()); 401dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk registerCmd(new GetHostByAddrCmd()); 41007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 42007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 43007e987fee7e815e0c4bc820f434a632b7a69a9dBrad FitzpatrickDnsProxyListener::GetAddrInfoHandler::~GetAddrInfoHandler() { 44007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick free(mHost); 45007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick free(mService); 46007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick free(mHints); 47007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 48007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 49007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrickvoid DnsProxyListener::GetAddrInfoHandler::start() { 50007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick pthread_create(&mThread, NULL, 51007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick DnsProxyListener::GetAddrInfoHandler::threadStart, this); 52007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 53007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 54007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrickvoid* DnsProxyListener::GetAddrInfoHandler::threadStart(void* obj) { 55007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick GetAddrInfoHandler* handler = reinterpret_cast<GetAddrInfoHandler*>(obj); 56007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick handler->run(); 57007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick delete handler; 58007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick pthread_exit(NULL); 59007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick return NULL; 60007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 61007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 62007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick// Sends 4 bytes of big-endian length, followed by the data. 63007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick// Returns true on success. 64007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrickstatic bool sendLenAndData(SocketClient *c, const int len, const void* data) { 65007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick uint32_t len_be = htonl(len); 66e6a3a58d6aa4b551e38e1e19fdfea2c0d2841b85Brad Fitzpatrick return c->sendData(&len_be, 4) == 0 && 67e6a3a58d6aa4b551e38e1e19fdfea2c0d2841b85Brad Fitzpatrick (len == 0 || c->sendData(data, len) == 0); 68007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 69007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 70007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrickvoid DnsProxyListener::GetAddrInfoHandler::run() { 71007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick if (DBG) { 727b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("GetAddrInfoHandler, now for %s / %s", mHost, mService); 73007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 74007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 75007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick struct addrinfo* result = NULL; 76ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun uint32_t rv = getaddrinfo(mHost, mService, mHints, &result); 77ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun if (rv) { 78ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun // getaddrinfo failed 79ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun mClient->sendBinaryMsg(ResponseCode::DnsProxyOperationFailed, &rv, sizeof(rv)); 80ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun } else { 81ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun bool success = !mClient->sendCode(ResponseCode::DnsProxyQueryResult); 82007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick struct addrinfo* ai = result; 83007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick while (ai && success) { 84007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick success = sendLenAndData(mClient, sizeof(struct addrinfo), ai) 85007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick && sendLenAndData(mClient, ai->ai_addrlen, ai->ai_addr) 86007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick && sendLenAndData(mClient, 87007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick ai->ai_canonname ? strlen(ai->ai_canonname) + 1 : 0, 88007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick ai->ai_canonname); 89007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick ai = ai->ai_next; 90007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 91007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick success = success && sendLenAndData(mClient, 0, ""); 92ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun if (!success) { 93ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun ALOGW("Error writing DNS result to client"); 94ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun } 95007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 96007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick if (result) { 97007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick freeaddrinfo(result); 98007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 9934ffd85aed3838d53bd1136c751a7825de1940e0Brad Fitzpatrick mClient->decRef(); 100007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 101007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 102007e987fee7e815e0c4bc820f434a632b7a69a9dBrad FitzpatrickDnsProxyListener::GetAddrInfoCmd::GetAddrInfoCmd() : 103007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick NetdCommand("getaddrinfo") { 104007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 105007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 106007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrickint DnsProxyListener::GetAddrInfoCmd::runCommand(SocketClient *cli, 107007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick int argc, char **argv) { 1080475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom if (DBG) { 1090475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom for (int i = 0; i < argc; i++) { 1107b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("argv[%i]=%s", i, argv[i]); 1110475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom } 1120475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom } 113007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick if (argc != 7) { 114ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun char* msg = NULL; 115ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun asprintf( &msg, "Invalid number of arguments to getaddrinfo: %i", argc); 116ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun ALOGW("%s", msg); 117ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun cli->sendMsg(ResponseCode::CommandParameterError, msg, false); 118ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun free(msg); 1190475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom return -1; 120007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 121007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 122007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick char* name = argv[1]; 123007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick if (strcmp("^", name) == 0) { 124007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick name = NULL; 125007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } else { 126007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick name = strdup(name); 127007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 128007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 129007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick char* service = argv[2]; 130007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick if (strcmp("^", service) == 0) { 131007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick service = NULL; 132007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } else { 133007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick service = strdup(service); 134007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 135007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 136007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick struct addrinfo* hints = NULL; 137007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick int ai_flags = atoi(argv[3]); 138007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick int ai_family = atoi(argv[4]); 139007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick int ai_socktype = atoi(argv[5]); 140007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick int ai_protocol = atoi(argv[6]); 141007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick if (ai_flags != -1 || ai_family != -1 || 142007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick ai_socktype != -1 || ai_protocol != -1) { 143007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick hints = (struct addrinfo*) calloc(1, sizeof(struct addrinfo)); 144007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick hints->ai_flags = ai_flags; 145007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick hints->ai_family = ai_family; 146007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick hints->ai_socktype = ai_socktype; 147007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick hints->ai_protocol = ai_protocol; 148007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 149007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 150007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick if (DBG) { 1517b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("GetAddrInfoHandler for %s / %s", 152007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick name ? name : "[nullhost]", 153007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick service ? service : "[nullservice]"); 154007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 155007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 15634ffd85aed3838d53bd1136c751a7825de1940e0Brad Fitzpatrick cli->incRef(); 157007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick DnsProxyListener::GetAddrInfoHandler* handler = 158007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick new DnsProxyListener::GetAddrInfoHandler(cli, name, service, hints); 159007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick handler->start(); 160007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 161007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick return 0; 162007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 1631dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 1641dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk/******************************************************* 1651dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk * GetHostByAddr * 1661dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk *******************************************************/ 1671dbd6cf148ea3fab57ec0644c336e94c78a488beMattias FalkDnsProxyListener::GetHostByAddrCmd::GetHostByAddrCmd() : 1681dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk NetdCommand("gethostbyaddr") { 1691dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk} 1701dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 1711dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falkint DnsProxyListener::GetHostByAddrCmd::runCommand(SocketClient *cli, 1721dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk int argc, char **argv) { 1730475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom if (DBG) { 1740475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom for (int i = 0; i < argc; i++) { 1757b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("argv[%i]=%s", i, argv[i]); 1760475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom } 1770475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom } 178ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun 1791dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk if (argc != 4) { 180ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun char* msg = NULL; 181ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun asprintf(&msg, "Invalid number of arguments to gethostbyaddr: %i", argc); 182ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun ALOGW("%s", msg); 183ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun cli->sendMsg(ResponseCode::CommandParameterError, msg, false); 184ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun free(msg); 1850475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom return -1; 1861dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk } 1871dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 1880475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom char* addrStr = argv[1]; 1891dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk int addrLen = atoi(argv[2]); 1901dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk int addrFamily = atoi(argv[3]); 1911dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 1920475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom void* addr = malloc(sizeof(struct in6_addr)); 1930475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom errno = 0; 1940475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom int result = inet_pton(addrFamily, addrStr, addr); 1950475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom if (result <= 0) { 196ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun char* msg = NULL; 197ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun asprintf(&msg, "inet_pton(\"%s\") failed %s", addrStr, strerror(errno)); 198ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun ALOGW("%s", msg); 199ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun cli->sendMsg(ResponseCode::OperationFailed, msg, false); 2000475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom free(addr); 201ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun free(msg); 2020475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom return -1; 2030475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom } 2040475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom 20534ffd85aed3838d53bd1136c751a7825de1940e0Brad Fitzpatrick cli->incRef(); 2061dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk DnsProxyListener::GetHostByAddrHandler* handler = 2071dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk new DnsProxyListener::GetHostByAddrHandler(cli, addr, addrLen, addrFamily); 2081dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk handler->start(); 2091dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 2101dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk return 0; 2111dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk} 2121dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 2131dbd6cf148ea3fab57ec0644c336e94c78a488beMattias FalkDnsProxyListener::GetHostByAddrHandler::~GetHostByAddrHandler() { 2141dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk free(mAddress); 2151dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk} 2161dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 2171dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falkvoid DnsProxyListener::GetHostByAddrHandler::start() { 2181dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk pthread_create(&mThread, NULL, 2191dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk DnsProxyListener::GetHostByAddrHandler::threadStart, this); 2201dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk} 2211dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 2221dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falkvoid* DnsProxyListener::GetHostByAddrHandler::threadStart(void* obj) { 2231dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk GetHostByAddrHandler* handler = reinterpret_cast<GetHostByAddrHandler*>(obj); 2241dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk handler->run(); 2251dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk delete handler; 2261dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk pthread_exit(NULL); 2271dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk return NULL; 2281dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk} 2291dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 2301dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falkvoid DnsProxyListener::GetHostByAddrHandler::run() { 2311dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk if (DBG) { 2327b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("DnsProxyListener::GetHostByAddrHandler::run\n"); 2331dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk } 2341dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 2351dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk struct hostent* hp; 2361dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 2370475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom // NOTE gethostbyaddr should take a void* but bionic thinks it should be char* 2380475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom hp = gethostbyaddr((char*)mAddress, mAddressLen, mAddressFamily); 2391dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 2401dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk if (DBG) { 2417b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("GetHostByAddrHandler::run gethostbyaddr errno: %s hp->h_name = %s, name_len = %d\n", 2421dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk hp ? "success" : strerror(errno), 2431dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk (hp && hp->h_name) ? hp->h_name: "null", 2441dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk (hp && hp->h_name) ? strlen(hp->h_name)+ 1 : 0); 2451dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk } 2461dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 247ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun bool failed = true; 248ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun if (hp) { 249ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun failed = mClient->sendBinaryMsg(ResponseCode::DnsProxyQueryResult, 250ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun hp->h_name ? hp->h_name : "", 251ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun hp->h_name ? strlen(hp->h_name)+ 1 : 0); 252ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun } else { 253ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun uint32_t error = h_errno; 254ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun failed = mClient->sendBinaryMsg(ResponseCode::DnsProxyOperationFailed, 255ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun &error, sizeof(error)); 256ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun } 2571dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 258ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun if (failed) { 2590e76b761a1514d5182675dd7b7d33725f62d6bc5Steve Block ALOGW("GetHostByAddrHandler: Error writing DNS result to client\n"); 2601dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk } 26134ffd85aed3838d53bd1136c751a7825de1940e0Brad Fitzpatrick mClient->decRef(); 2621dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk} 263