DnsProxyListener.cpp revision 52b17bcfdf63a9d00f3ab1bc6ff738cbc4d30b0b
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> 270cdb680c7648b0f48e6513926cb0a06d290a5cbeJurijs Oniscuks#include <pthread.h> 282d4610ec34cc78799a3353638fa05ee53276892aMattias Falk#include <resolv_iface.h> 292d4610ec34cc78799a3353638fa05ee53276892aMattias Falk#include <net/if.h> 30007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 31007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick#define LOG_TAG "DnsProxyListener" 32007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick#define DBG 0 332d4610ec34cc78799a3353638fa05ee53276892aMattias Falk#define VDBG 0 34007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 35007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick#include <cutils/log.h> 36007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick#include <sysutils/SocketClient.h> 37007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 38007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick#include "DnsProxyListener.h" 39ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun#include "ResponseCode.h" 40007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 41007e987fee7e815e0c4bc820f434a632b7a69a9dBrad FitzpatrickDnsProxyListener::DnsProxyListener() : 42007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick FrameworkListener("dnsproxyd") { 43007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick registerCmd(new GetAddrInfoCmd()); 441dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk registerCmd(new GetHostByAddrCmd()); 452d4610ec34cc78799a3353638fa05ee53276892aMattias Falk registerCmd(new GetHostByNameCmd()); 462d4610ec34cc78799a3353638fa05ee53276892aMattias Falk} 472d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 482d4610ec34cc78799a3353638fa05ee53276892aMattias FalkDnsProxyListener::GetAddrInfoHandler::GetAddrInfoHandler(SocketClient *c, 492d4610ec34cc78799a3353638fa05ee53276892aMattias Falk char* host, 502d4610ec34cc78799a3353638fa05ee53276892aMattias Falk char* service, 512d4610ec34cc78799a3353638fa05ee53276892aMattias Falk struct addrinfo* hints, 522d4610ec34cc78799a3353638fa05ee53276892aMattias Falk char* iface, 5352b17bcfdf63a9d00f3ab1bc6ff738cbc4d30b0bNick Kralevich pid_t pid) 542d4610ec34cc78799a3353638fa05ee53276892aMattias Falk : mClient(c), 552d4610ec34cc78799a3353638fa05ee53276892aMattias Falk mHost(host), 562d4610ec34cc78799a3353638fa05ee53276892aMattias Falk mService(service), 572d4610ec34cc78799a3353638fa05ee53276892aMattias Falk mHints(hints), 582d4610ec34cc78799a3353638fa05ee53276892aMattias Falk mIface(iface), 592d4610ec34cc78799a3353638fa05ee53276892aMattias Falk mPid(pid) { 60007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 61007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 62007e987fee7e815e0c4bc820f434a632b7a69a9dBrad FitzpatrickDnsProxyListener::GetAddrInfoHandler::~GetAddrInfoHandler() { 63007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick free(mHost); 64007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick free(mService); 65007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick free(mHints); 662d4610ec34cc78799a3353638fa05ee53276892aMattias Falk free(mIface); 67007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 68007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 69007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrickvoid DnsProxyListener::GetAddrInfoHandler::start() { 700cdb680c7648b0f48e6513926cb0a06d290a5cbeJurijs Oniscuks pthread_t thread; 710cdb680c7648b0f48e6513926cb0a06d290a5cbeJurijs Oniscuks pthread_create(&thread, NULL, 72007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick DnsProxyListener::GetAddrInfoHandler::threadStart, this); 732d4610ec34cc78799a3353638fa05ee53276892aMattias Falk pthread_detach(thread); 74007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 75007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 76007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrickvoid* DnsProxyListener::GetAddrInfoHandler::threadStart(void* obj) { 77007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick GetAddrInfoHandler* handler = reinterpret_cast<GetAddrInfoHandler*>(obj); 78007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick handler->run(); 79007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick delete handler; 80007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick pthread_exit(NULL); 81007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick return NULL; 82007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 83007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 84007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick// Sends 4 bytes of big-endian length, followed by the data. 85007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick// Returns true on success. 86007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrickstatic bool sendLenAndData(SocketClient *c, const int len, const void* data) { 87007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick uint32_t len_be = htonl(len); 88e6a3a58d6aa4b551e38e1e19fdfea2c0d2841b85Brad Fitzpatrick return c->sendData(&len_be, 4) == 0 && 89e6a3a58d6aa4b551e38e1e19fdfea2c0d2841b85Brad Fitzpatrick (len == 0 || c->sendData(data, len) == 0); 90007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 91007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 922d4610ec34cc78799a3353638fa05ee53276892aMattias Falk// Returns true on success 932d4610ec34cc78799a3353638fa05ee53276892aMattias Falkstatic bool sendhostent(SocketClient *c, struct hostent *hp) { 942d4610ec34cc78799a3353638fa05ee53276892aMattias Falk bool success = true; 952d4610ec34cc78799a3353638fa05ee53276892aMattias Falk int i; 962d4610ec34cc78799a3353638fa05ee53276892aMattias Falk if (hp->h_name != NULL) { 972d4610ec34cc78799a3353638fa05ee53276892aMattias Falk success &= sendLenAndData(c, strlen(hp->h_name)+1, hp->h_name); 982d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } else { 992d4610ec34cc78799a3353638fa05ee53276892aMattias Falk success &= sendLenAndData(c, 0, "") == 0; 1002d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } 1012d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 1022d4610ec34cc78799a3353638fa05ee53276892aMattias Falk for (i=0; hp->h_aliases[i] != NULL; i++) { 1032d4610ec34cc78799a3353638fa05ee53276892aMattias Falk success &= sendLenAndData(c, strlen(hp->h_aliases[i])+1, hp->h_aliases[i]); 1042d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } 1052d4610ec34cc78799a3353638fa05ee53276892aMattias Falk success &= sendLenAndData(c, 0, ""); // null to indicate we're done 1062d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 1072d4610ec34cc78799a3353638fa05ee53276892aMattias Falk uint32_t buf = htonl(hp->h_addrtype); 1082d4610ec34cc78799a3353638fa05ee53276892aMattias Falk success &= c->sendData(&buf, sizeof(buf)) == 0; 1092d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 1102d4610ec34cc78799a3353638fa05ee53276892aMattias Falk buf = htonl(hp->h_length); 1112d4610ec34cc78799a3353638fa05ee53276892aMattias Falk success &= c->sendData(&buf, sizeof(buf)) == 0; 1122d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 1132d4610ec34cc78799a3353638fa05ee53276892aMattias Falk for (i=0; hp->h_addr_list[i] != NULL; i++) { 1142d4610ec34cc78799a3353638fa05ee53276892aMattias Falk success &= sendLenAndData(c, 16, hp->h_addr_list[i]); 1152d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } 1162d4610ec34cc78799a3353638fa05ee53276892aMattias Falk success &= sendLenAndData(c, 0, ""); // null to indicate we're done 1172d4610ec34cc78799a3353638fa05ee53276892aMattias Falk return success; 1182d4610ec34cc78799a3353638fa05ee53276892aMattias Falk} 1192d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 120007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrickvoid DnsProxyListener::GetAddrInfoHandler::run() { 121007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick if (DBG) { 1222d4610ec34cc78799a3353638fa05ee53276892aMattias Falk ALOGD("GetAddrInfoHandler, now for %s / %s / %s", mHost, mService, mIface); 1232d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } 1242d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 1252d4610ec34cc78799a3353638fa05ee53276892aMattias Falk char tmp[IF_NAMESIZE + 1]; 1262d4610ec34cc78799a3353638fa05ee53276892aMattias Falk if (mIface == NULL) { 1272d4610ec34cc78799a3353638fa05ee53276892aMattias Falk _resolv_get_pids_associated_interface(mPid, tmp, sizeof(tmp)); 128007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 129007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 130007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick struct addrinfo* result = NULL; 1312d4610ec34cc78799a3353638fa05ee53276892aMattias Falk uint32_t rv = android_getaddrinfoforiface(mHost, mService, mHints, mIface ? mIface : tmp, 1322d4610ec34cc78799a3353638fa05ee53276892aMattias Falk &result); 133ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun if (rv) { 134ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun // getaddrinfo failed 13540e0c13d6b77a9260b6da4c9e11cca8a5f994ea2Selim Gurun mClient->sendBinaryMsg(ResponseCode::DnsProxyOperationFailed, &rv, sizeof(rv)); 136ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun } else { 137ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun bool success = !mClient->sendCode(ResponseCode::DnsProxyQueryResult); 138007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick struct addrinfo* ai = result; 139007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick while (ai && success) { 140007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick success = sendLenAndData(mClient, sizeof(struct addrinfo), ai) 141007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick && sendLenAndData(mClient, ai->ai_addrlen, ai->ai_addr) 142007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick && sendLenAndData(mClient, 143007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick ai->ai_canonname ? strlen(ai->ai_canonname) + 1 : 0, 144007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick ai->ai_canonname); 145007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick ai = ai->ai_next; 146007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 147007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick success = success && sendLenAndData(mClient, 0, ""); 148ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun if (!success) { 149ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun ALOGW("Error writing DNS result to client"); 150ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun } 151007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 152007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick if (result) { 153007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick freeaddrinfo(result); 154007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 15534ffd85aed3838d53bd1136c751a7825de1940e0Brad Fitzpatrick mClient->decRef(); 156007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 157007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 158007e987fee7e815e0c4bc820f434a632b7a69a9dBrad FitzpatrickDnsProxyListener::GetAddrInfoCmd::GetAddrInfoCmd() : 159007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick NetdCommand("getaddrinfo") { 160007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 161007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 162007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrickint DnsProxyListener::GetAddrInfoCmd::runCommand(SocketClient *cli, 163007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick int argc, char **argv) { 1640475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom if (DBG) { 1650475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom for (int i = 0; i < argc; i++) { 1667b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("argv[%i]=%s", i, argv[i]); 1670475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom } 1680475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom } 16952b17bcfdf63a9d00f3ab1bc6ff738cbc4d30b0bNick Kralevich if (argc != 8) { 170ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun char* msg = NULL; 171ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun asprintf( &msg, "Invalid number of arguments to getaddrinfo: %i", argc); 172ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun ALOGW("%s", msg); 173ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun cli->sendMsg(ResponseCode::CommandParameterError, msg, false); 174ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun free(msg); 1750475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom return -1; 176007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 177007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 178007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick char* name = argv[1]; 179007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick if (strcmp("^", name) == 0) { 180007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick name = NULL; 181007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } else { 182007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick name = strdup(name); 183007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 184007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 185007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick char* service = argv[2]; 186007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick if (strcmp("^", service) == 0) { 187007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick service = NULL; 188007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } else { 189007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick service = strdup(service); 190007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 191007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 1922d4610ec34cc78799a3353638fa05ee53276892aMattias Falk char* iface = argv[7]; 1932d4610ec34cc78799a3353638fa05ee53276892aMattias Falk if (strcmp(iface, "^") == 0) { 1942d4610ec34cc78799a3353638fa05ee53276892aMattias Falk iface = NULL; 1952d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } else { 1962d4610ec34cc78799a3353638fa05ee53276892aMattias Falk iface = strdup(iface); 1972d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } 1982d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 199007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick struct addrinfo* hints = NULL; 200007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick int ai_flags = atoi(argv[3]); 201007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick int ai_family = atoi(argv[4]); 202007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick int ai_socktype = atoi(argv[5]); 203007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick int ai_protocol = atoi(argv[6]); 20452b17bcfdf63a9d00f3ab1bc6ff738cbc4d30b0bNick Kralevich pid_t pid = cli->getPid(); 2052d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 206007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick if (ai_flags != -1 || ai_family != -1 || 207007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick ai_socktype != -1 || ai_protocol != -1) { 208007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick hints = (struct addrinfo*) calloc(1, sizeof(struct addrinfo)); 209007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick hints->ai_flags = ai_flags; 210007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick hints->ai_family = ai_family; 211007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick hints->ai_socktype = ai_socktype; 212007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick hints->ai_protocol = ai_protocol; 213007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 214007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 215007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick if (DBG) { 2162d4610ec34cc78799a3353638fa05ee53276892aMattias Falk ALOGD("GetAddrInfoHandler for %s / %s / %s / %d", 217007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick name ? name : "[nullhost]", 2182d4610ec34cc78799a3353638fa05ee53276892aMattias Falk service ? service : "[nullservice]", 2192d4610ec34cc78799a3353638fa05ee53276892aMattias Falk iface ? iface : "[nulliface]", 2202d4610ec34cc78799a3353638fa05ee53276892aMattias Falk pid); 221007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 222007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 22334ffd85aed3838d53bd1136c751a7825de1940e0Brad Fitzpatrick cli->incRef(); 224007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick DnsProxyListener::GetAddrInfoHandler* handler = 2252d4610ec34cc78799a3353638fa05ee53276892aMattias Falk new DnsProxyListener::GetAddrInfoHandler(cli, name, service, hints, iface, pid); 226007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick handler->start(); 227007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 228007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick return 0; 229007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 2301dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 2311dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk/******************************************************* 2322d4610ec34cc78799a3353638fa05ee53276892aMattias Falk * GetHostByName * 2332d4610ec34cc78799a3353638fa05ee53276892aMattias Falk *******************************************************/ 2342d4610ec34cc78799a3353638fa05ee53276892aMattias FalkDnsProxyListener::GetHostByNameCmd::GetHostByNameCmd() : 2352d4610ec34cc78799a3353638fa05ee53276892aMattias Falk NetdCommand("gethostbyname") { 2362d4610ec34cc78799a3353638fa05ee53276892aMattias Falk} 2372d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 2382d4610ec34cc78799a3353638fa05ee53276892aMattias Falkint DnsProxyListener::GetHostByNameCmd::runCommand(SocketClient *cli, 2392d4610ec34cc78799a3353638fa05ee53276892aMattias Falk int argc, char **argv) { 2402d4610ec34cc78799a3353638fa05ee53276892aMattias Falk if (DBG) { 2412d4610ec34cc78799a3353638fa05ee53276892aMattias Falk for (int i = 0; i < argc; i++) { 2422d4610ec34cc78799a3353638fa05ee53276892aMattias Falk ALOGD("argv[%i]=%s", i, argv[i]); 2432d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } 2442d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } 24552b17bcfdf63a9d00f3ab1bc6ff738cbc4d30b0bNick Kralevich if (argc != 4) { 2462d4610ec34cc78799a3353638fa05ee53276892aMattias Falk char* msg = NULL; 2472d4610ec34cc78799a3353638fa05ee53276892aMattias Falk asprintf(&msg, "Invalid number of arguments to gethostbyname: %i", argc); 2482d4610ec34cc78799a3353638fa05ee53276892aMattias Falk ALOGW("%s", msg); 2492d4610ec34cc78799a3353638fa05ee53276892aMattias Falk cli->sendMsg(ResponseCode::CommandParameterError, msg, false); 2502d4610ec34cc78799a3353638fa05ee53276892aMattias Falk free(msg); 2512d4610ec34cc78799a3353638fa05ee53276892aMattias Falk return -1; 2522d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } 2532d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 25452b17bcfdf63a9d00f3ab1bc6ff738cbc4d30b0bNick Kralevich pid_t pid = cli->getPid(); 25552b17bcfdf63a9d00f3ab1bc6ff738cbc4d30b0bNick Kralevich char* iface = argv[1]; 25652b17bcfdf63a9d00f3ab1bc6ff738cbc4d30b0bNick Kralevich char* name = argv[2]; 25752b17bcfdf63a9d00f3ab1bc6ff738cbc4d30b0bNick Kralevich int af = atoi(argv[3]); 2582d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 2592d4610ec34cc78799a3353638fa05ee53276892aMattias Falk if (strcmp(iface, "^") == 0) { 2602d4610ec34cc78799a3353638fa05ee53276892aMattias Falk iface = NULL; 2612d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } else { 2622d4610ec34cc78799a3353638fa05ee53276892aMattias Falk iface = strdup(iface); 2632d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } 2642d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 2652d4610ec34cc78799a3353638fa05ee53276892aMattias Falk if (strcmp(name, "^") == 0) { 2662d4610ec34cc78799a3353638fa05ee53276892aMattias Falk name = NULL; 2672d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } else { 2682d4610ec34cc78799a3353638fa05ee53276892aMattias Falk name = strdup(name); 2692d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } 2702d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 2712d4610ec34cc78799a3353638fa05ee53276892aMattias Falk cli->incRef(); 2722d4610ec34cc78799a3353638fa05ee53276892aMattias Falk DnsProxyListener::GetHostByNameHandler* handler = 2732d4610ec34cc78799a3353638fa05ee53276892aMattias Falk new DnsProxyListener::GetHostByNameHandler(cli, pid, iface, name, af); 2742d4610ec34cc78799a3353638fa05ee53276892aMattias Falk handler->start(); 2752d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 2762d4610ec34cc78799a3353638fa05ee53276892aMattias Falk return 0; 2772d4610ec34cc78799a3353638fa05ee53276892aMattias Falk} 2782d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 2792d4610ec34cc78799a3353638fa05ee53276892aMattias FalkDnsProxyListener::GetHostByNameHandler::GetHostByNameHandler(SocketClient* c, 28052b17bcfdf63a9d00f3ab1bc6ff738cbc4d30b0bNick Kralevich pid_t pid, 2812d4610ec34cc78799a3353638fa05ee53276892aMattias Falk char* iface, 2822d4610ec34cc78799a3353638fa05ee53276892aMattias Falk char* name, 2832d4610ec34cc78799a3353638fa05ee53276892aMattias Falk int af) 2842d4610ec34cc78799a3353638fa05ee53276892aMattias Falk : mClient(c), 2852d4610ec34cc78799a3353638fa05ee53276892aMattias Falk mPid(pid), 2862d4610ec34cc78799a3353638fa05ee53276892aMattias Falk mIface(iface), 2872d4610ec34cc78799a3353638fa05ee53276892aMattias Falk mName(name), 2882d4610ec34cc78799a3353638fa05ee53276892aMattias Falk mAf(af) { 2892d4610ec34cc78799a3353638fa05ee53276892aMattias Falk} 2902d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 2912d4610ec34cc78799a3353638fa05ee53276892aMattias FalkDnsProxyListener::GetHostByNameHandler::~GetHostByNameHandler() { 2922d4610ec34cc78799a3353638fa05ee53276892aMattias Falk free(mIface); 2932d4610ec34cc78799a3353638fa05ee53276892aMattias Falk free(mName); 2942d4610ec34cc78799a3353638fa05ee53276892aMattias Falk} 2952d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 2962d4610ec34cc78799a3353638fa05ee53276892aMattias Falkvoid DnsProxyListener::GetHostByNameHandler::start() { 2972d4610ec34cc78799a3353638fa05ee53276892aMattias Falk pthread_t thread; 2982d4610ec34cc78799a3353638fa05ee53276892aMattias Falk pthread_create(&thread, NULL, 2992d4610ec34cc78799a3353638fa05ee53276892aMattias Falk DnsProxyListener::GetHostByNameHandler::threadStart, this); 3002d4610ec34cc78799a3353638fa05ee53276892aMattias Falk pthread_detach(thread); 3012d4610ec34cc78799a3353638fa05ee53276892aMattias Falk} 3022d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 3032d4610ec34cc78799a3353638fa05ee53276892aMattias Falkvoid* DnsProxyListener::GetHostByNameHandler::threadStart(void* obj) { 3042d4610ec34cc78799a3353638fa05ee53276892aMattias Falk GetHostByNameHandler* handler = reinterpret_cast<GetHostByNameHandler*>(obj); 3052d4610ec34cc78799a3353638fa05ee53276892aMattias Falk handler->run(); 3062d4610ec34cc78799a3353638fa05ee53276892aMattias Falk delete handler; 3072d4610ec34cc78799a3353638fa05ee53276892aMattias Falk pthread_exit(NULL); 3082d4610ec34cc78799a3353638fa05ee53276892aMattias Falk return NULL; 3092d4610ec34cc78799a3353638fa05ee53276892aMattias Falk} 3102d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 3112d4610ec34cc78799a3353638fa05ee53276892aMattias Falkvoid DnsProxyListener::GetHostByNameHandler::run() { 3122d4610ec34cc78799a3353638fa05ee53276892aMattias Falk if (DBG) { 3132d4610ec34cc78799a3353638fa05ee53276892aMattias Falk ALOGD("DnsProxyListener::GetHostByNameHandler::run\n"); 3142d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } 3152d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 3162d4610ec34cc78799a3353638fa05ee53276892aMattias Falk char iface[IF_NAMESIZE + 1]; 3172d4610ec34cc78799a3353638fa05ee53276892aMattias Falk if (mIface == NULL) { 3182d4610ec34cc78799a3353638fa05ee53276892aMattias Falk _resolv_get_pids_associated_interface(mPid, iface, sizeof(iface)); 3192d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } 3202d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 3212d4610ec34cc78799a3353638fa05ee53276892aMattias Falk struct hostent* hp; 3222d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 3232d4610ec34cc78799a3353638fa05ee53276892aMattias Falk hp = android_gethostbynameforiface(mName, mAf, mIface ? mIface : iface); 3242d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 3252d4610ec34cc78799a3353638fa05ee53276892aMattias Falk if (DBG) { 3262d4610ec34cc78799a3353638fa05ee53276892aMattias Falk ALOGD("GetHostByNameHandler::run gethostbyname errno: %s hp->h_name = %s, name_len = %d\n", 3272d4610ec34cc78799a3353638fa05ee53276892aMattias Falk hp ? "success" : strerror(errno), 3282d4610ec34cc78799a3353638fa05ee53276892aMattias Falk (hp && hp->h_name) ? hp->h_name: "null", 3292d4610ec34cc78799a3353638fa05ee53276892aMattias Falk (hp && hp->h_name) ? strlen(hp->h_name)+ 1 : 0); 3302d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } 3312d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 3322d4610ec34cc78799a3353638fa05ee53276892aMattias Falk bool success = true; 3332d4610ec34cc78799a3353638fa05ee53276892aMattias Falk if (hp) { 3342d4610ec34cc78799a3353638fa05ee53276892aMattias Falk success = mClient->sendCode(ResponseCode::DnsProxyQueryResult) == 0; 3352d4610ec34cc78799a3353638fa05ee53276892aMattias Falk success &= sendhostent(mClient, hp); 3362d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } else { 3372d4610ec34cc78799a3353638fa05ee53276892aMattias Falk success = mClient->sendBinaryMsg(ResponseCode::DnsProxyOperationFailed, NULL, 0) == 0; 3382d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } 3392d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 3402d4610ec34cc78799a3353638fa05ee53276892aMattias Falk if (!success) { 3412d4610ec34cc78799a3353638fa05ee53276892aMattias Falk ALOGW("GetHostByNameHandler: Error writing DNS result to client\n"); 3422d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } 3432d4610ec34cc78799a3353638fa05ee53276892aMattias Falk mClient->decRef(); 3442d4610ec34cc78799a3353638fa05ee53276892aMattias Falk} 3452d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 3462d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 3472d4610ec34cc78799a3353638fa05ee53276892aMattias Falk/******************************************************* 3482d4610ec34cc78799a3353638fa05ee53276892aMattias Falk * GetHostByAddr * 3491dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk *******************************************************/ 3501dbd6cf148ea3fab57ec0644c336e94c78a488beMattias FalkDnsProxyListener::GetHostByAddrCmd::GetHostByAddrCmd() : 3511dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk NetdCommand("gethostbyaddr") { 3521dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk} 3531dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 3541dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falkint DnsProxyListener::GetHostByAddrCmd::runCommand(SocketClient *cli, 3551dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk int argc, char **argv) { 3560475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom if (DBG) { 3570475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom for (int i = 0; i < argc; i++) { 3587b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("argv[%i]=%s", i, argv[i]); 3590475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom } 3600475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom } 36152b17bcfdf63a9d00f3ab1bc6ff738cbc4d30b0bNick Kralevich if (argc != 5) { 362ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun char* msg = NULL; 363ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun asprintf(&msg, "Invalid number of arguments to gethostbyaddr: %i", argc); 364ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun ALOGW("%s", msg); 365ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun cli->sendMsg(ResponseCode::CommandParameterError, msg, false); 366ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun free(msg); 3670475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom return -1; 3681dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk } 3691dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 3700475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom char* addrStr = argv[1]; 3711dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk int addrLen = atoi(argv[2]); 3721dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk int addrFamily = atoi(argv[3]); 37352b17bcfdf63a9d00f3ab1bc6ff738cbc4d30b0bNick Kralevich pid_t pid = cli->getPid(); 37452b17bcfdf63a9d00f3ab1bc6ff738cbc4d30b0bNick Kralevich char* iface = argv[4]; 3752d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 3762d4610ec34cc78799a3353638fa05ee53276892aMattias Falk if (strcmp(iface, "^") == 0) { 3772d4610ec34cc78799a3353638fa05ee53276892aMattias Falk iface = NULL; 3782d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } else { 3792d4610ec34cc78799a3353638fa05ee53276892aMattias Falk iface = strdup(iface); 3802d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } 3811dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 3820475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom void* addr = malloc(sizeof(struct in6_addr)); 3830475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom errno = 0; 3840475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom int result = inet_pton(addrFamily, addrStr, addr); 3850475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom if (result <= 0) { 386ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun char* msg = NULL; 387ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun asprintf(&msg, "inet_pton(\"%s\") failed %s", addrStr, strerror(errno)); 388ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun ALOGW("%s", msg); 389ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun cli->sendMsg(ResponseCode::OperationFailed, msg, false); 3900475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom free(addr); 391ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun free(msg); 3920475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom return -1; 3930475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom } 3940475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom 39534ffd85aed3838d53bd1136c751a7825de1940e0Brad Fitzpatrick cli->incRef(); 3961dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk DnsProxyListener::GetHostByAddrHandler* handler = 3972d4610ec34cc78799a3353638fa05ee53276892aMattias Falk new DnsProxyListener::GetHostByAddrHandler(cli, addr, addrLen, addrFamily, iface ,pid); 3981dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk handler->start(); 3991dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 4001dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk return 0; 4011dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk} 4021dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 4032d4610ec34cc78799a3353638fa05ee53276892aMattias FalkDnsProxyListener::GetHostByAddrHandler::GetHostByAddrHandler(SocketClient* c, 4042d4610ec34cc78799a3353638fa05ee53276892aMattias Falk void* address, 4052d4610ec34cc78799a3353638fa05ee53276892aMattias Falk int addressLen, 4062d4610ec34cc78799a3353638fa05ee53276892aMattias Falk int addressFamily, 4072d4610ec34cc78799a3353638fa05ee53276892aMattias Falk char* iface, 40852b17bcfdf63a9d00f3ab1bc6ff738cbc4d30b0bNick Kralevich pid_t pid) 4092d4610ec34cc78799a3353638fa05ee53276892aMattias Falk : mClient(c), 4102d4610ec34cc78799a3353638fa05ee53276892aMattias Falk mAddress(address), 4112d4610ec34cc78799a3353638fa05ee53276892aMattias Falk mAddressLen(addressLen), 4122d4610ec34cc78799a3353638fa05ee53276892aMattias Falk mAddressFamily(addressFamily), 4132d4610ec34cc78799a3353638fa05ee53276892aMattias Falk mIface(iface), 4142d4610ec34cc78799a3353638fa05ee53276892aMattias Falk mPid(pid) { 4152d4610ec34cc78799a3353638fa05ee53276892aMattias Falk} 4162d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 4171dbd6cf148ea3fab57ec0644c336e94c78a488beMattias FalkDnsProxyListener::GetHostByAddrHandler::~GetHostByAddrHandler() { 4181dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk free(mAddress); 4192d4610ec34cc78799a3353638fa05ee53276892aMattias Falk free(mIface); 4201dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk} 4211dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 4221dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falkvoid DnsProxyListener::GetHostByAddrHandler::start() { 4230cdb680c7648b0f48e6513926cb0a06d290a5cbeJurijs Oniscuks pthread_t thread; 4240cdb680c7648b0f48e6513926cb0a06d290a5cbeJurijs Oniscuks pthread_create(&thread, NULL, 4251dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk DnsProxyListener::GetHostByAddrHandler::threadStart, this); 4262d4610ec34cc78799a3353638fa05ee53276892aMattias Falk pthread_detach(thread); 4271dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk} 4281dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 4291dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falkvoid* DnsProxyListener::GetHostByAddrHandler::threadStart(void* obj) { 4301dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk GetHostByAddrHandler* handler = reinterpret_cast<GetHostByAddrHandler*>(obj); 4311dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk handler->run(); 4321dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk delete handler; 4331dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk pthread_exit(NULL); 4341dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk return NULL; 4351dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk} 4361dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 4371dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falkvoid DnsProxyListener::GetHostByAddrHandler::run() { 4381dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk if (DBG) { 4397b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("DnsProxyListener::GetHostByAddrHandler::run\n"); 4401dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk } 4411dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 4422d4610ec34cc78799a3353638fa05ee53276892aMattias Falk char tmp[IF_NAMESIZE + 1]; 4432d4610ec34cc78799a3353638fa05ee53276892aMattias Falk if (mIface == NULL) { 4442d4610ec34cc78799a3353638fa05ee53276892aMattias Falk _resolv_get_pids_associated_interface(mPid, tmp, sizeof(tmp)); 4452d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } 4462d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 4471dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk struct hostent* hp; 4481dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 4490475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom // NOTE gethostbyaddr should take a void* but bionic thinks it should be char* 4502d4610ec34cc78799a3353638fa05ee53276892aMattias Falk hp = android_gethostbyaddrforiface((char*)mAddress, mAddressLen, mAddressFamily, 4512d4610ec34cc78799a3353638fa05ee53276892aMattias Falk mIface ? mIface : tmp); 4521dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 4531dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk if (DBG) { 4547b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("GetHostByAddrHandler::run gethostbyaddr errno: %s hp->h_name = %s, name_len = %d\n", 4551dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk hp ? "success" : strerror(errno), 4561dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk (hp && hp->h_name) ? hp->h_name: "null", 4571dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk (hp && hp->h_name) ? strlen(hp->h_name)+ 1 : 0); 4581dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk } 4591dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 4602d4610ec34cc78799a3353638fa05ee53276892aMattias Falk bool success = true; 461ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun if (hp) { 4622d4610ec34cc78799a3353638fa05ee53276892aMattias Falk success = mClient->sendCode(ResponseCode::DnsProxyQueryResult) == 0; 4632d4610ec34cc78799a3353638fa05ee53276892aMattias Falk success &= sendhostent(mClient, hp); 464ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun } else { 4652d4610ec34cc78799a3353638fa05ee53276892aMattias Falk success = mClient->sendBinaryMsg(ResponseCode::DnsProxyOperationFailed, NULL, 0) == 0; 466ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun } 4671dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 4682d4610ec34cc78799a3353638fa05ee53276892aMattias Falk if (!success) { 4690e76b761a1514d5182675dd7b7d33725f62d6bc5Steve Block ALOGW("GetHostByAddrHandler: Error writing DNS result to client\n"); 4701dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk } 47134ffd85aed3838d53bd1136c751a7825de1940e0Brad Fitzpatrick mClient->decRef(); 4721dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk} 473