DnsProxyListener.cpp revision 1011b4941d96d9fd90bc7243be387b63ec775936
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> 28a0efaece8c05370f201efe099a537ceb014c6fdfSzymon Jakubczak#include <resolv_netid.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 387dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen#include "Fwmark.h" 39007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick#include "DnsProxyListener.h" 407dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen#include "NetdConstants.h" 417dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen#include "NetworkController.h" 42ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun#include "ResponseCode.h" 43007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 44f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram RamachandranDnsProxyListener::DnsProxyListener(const NetworkController* netCtrl) : 45f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran FrameworkListener("dnsproxyd"), mNetCtrl(netCtrl) { 467dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen registerCmd(new GetAddrInfoCmd(this)); 477dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen registerCmd(new GetHostByAddrCmd(this)); 487dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen registerCmd(new GetHostByNameCmd(this)); 497dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen} 507dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen 512d4610ec34cc78799a3353638fa05ee53276892aMattias FalkDnsProxyListener::GetAddrInfoHandler::GetAddrInfoHandler(SocketClient *c, 522d4610ec34cc78799a3353638fa05ee53276892aMattias Falk char* host, 532d4610ec34cc78799a3353638fa05ee53276892aMattias Falk char* service, 542d4610ec34cc78799a3353638fa05ee53276892aMattias Falk struct addrinfo* hints, 557dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen unsigned netId, 567dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen uint32_t mark) 572d4610ec34cc78799a3353638fa05ee53276892aMattias Falk : mClient(c), 582d4610ec34cc78799a3353638fa05ee53276892aMattias Falk mHost(host), 592d4610ec34cc78799a3353638fa05ee53276892aMattias Falk mService(service), 602d4610ec34cc78799a3353638fa05ee53276892aMattias Falk mHints(hints), 617dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen mNetId(netId), 627dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen mMark(mark) { 63007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 64007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 65007e987fee7e815e0c4bc820f434a632b7a69a9dBrad FitzpatrickDnsProxyListener::GetAddrInfoHandler::~GetAddrInfoHandler() { 66007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick free(mHost); 67007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick free(mService); 68007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick free(mHints); 69007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 70007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 71007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrickvoid DnsProxyListener::GetAddrInfoHandler::start() { 720cdb680c7648b0f48e6513926cb0a06d290a5cbeJurijs Oniscuks pthread_t thread; 730cdb680c7648b0f48e6513926cb0a06d290a5cbeJurijs Oniscuks pthread_create(&thread, NULL, 74007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick DnsProxyListener::GetAddrInfoHandler::threadStart, this); 752d4610ec34cc78799a3353638fa05ee53276892aMattias Falk pthread_detach(thread); 76007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 77007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 78007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrickvoid* DnsProxyListener::GetAddrInfoHandler::threadStart(void* obj) { 79007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick GetAddrInfoHandler* handler = reinterpret_cast<GetAddrInfoHandler*>(obj); 80007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick handler->run(); 81007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick delete handler; 82007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick pthread_exit(NULL); 83007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick return NULL; 84007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 85007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 86007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick// Sends 4 bytes of big-endian length, followed by the data. 87007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick// Returns true on success. 88007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrickstatic bool sendLenAndData(SocketClient *c, const int len, const void* data) { 89007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick uint32_t len_be = htonl(len); 90e6a3a58d6aa4b551e38e1e19fdfea2c0d2841b85Brad Fitzpatrick return c->sendData(&len_be, 4) == 0 && 91e6a3a58d6aa4b551e38e1e19fdfea2c0d2841b85Brad Fitzpatrick (len == 0 || c->sendData(data, len) == 0); 92007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 93007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 942d4610ec34cc78799a3353638fa05ee53276892aMattias Falk// Returns true on success 952d4610ec34cc78799a3353638fa05ee53276892aMattias Falkstatic bool sendhostent(SocketClient *c, struct hostent *hp) { 962d4610ec34cc78799a3353638fa05ee53276892aMattias Falk bool success = true; 972d4610ec34cc78799a3353638fa05ee53276892aMattias Falk int i; 982d4610ec34cc78799a3353638fa05ee53276892aMattias Falk if (hp->h_name != NULL) { 992d4610ec34cc78799a3353638fa05ee53276892aMattias Falk success &= sendLenAndData(c, strlen(hp->h_name)+1, hp->h_name); 1002d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } else { 1012d4610ec34cc78799a3353638fa05ee53276892aMattias Falk success &= sendLenAndData(c, 0, "") == 0; 1022d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } 1032d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 1042d4610ec34cc78799a3353638fa05ee53276892aMattias Falk for (i=0; hp->h_aliases[i] != NULL; i++) { 1052d4610ec34cc78799a3353638fa05ee53276892aMattias Falk success &= sendLenAndData(c, strlen(hp->h_aliases[i])+1, hp->h_aliases[i]); 1062d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } 1072d4610ec34cc78799a3353638fa05ee53276892aMattias Falk success &= sendLenAndData(c, 0, ""); // null to indicate we're done 1082d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 1092d4610ec34cc78799a3353638fa05ee53276892aMattias Falk uint32_t buf = htonl(hp->h_addrtype); 1102d4610ec34cc78799a3353638fa05ee53276892aMattias Falk success &= c->sendData(&buf, sizeof(buf)) == 0; 1112d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 1122d4610ec34cc78799a3353638fa05ee53276892aMattias Falk buf = htonl(hp->h_length); 1132d4610ec34cc78799a3353638fa05ee53276892aMattias Falk success &= c->sendData(&buf, sizeof(buf)) == 0; 1142d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 1152d4610ec34cc78799a3353638fa05ee53276892aMattias Falk for (i=0; hp->h_addr_list[i] != NULL; i++) { 1162d4610ec34cc78799a3353638fa05ee53276892aMattias Falk success &= sendLenAndData(c, 16, hp->h_addr_list[i]); 1172d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } 1182d4610ec34cc78799a3353638fa05ee53276892aMattias Falk success &= sendLenAndData(c, 0, ""); // null to indicate we're done 1192d4610ec34cc78799a3353638fa05ee53276892aMattias Falk return success; 1202d4610ec34cc78799a3353638fa05ee53276892aMattias Falk} 1212d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 122007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrickvoid DnsProxyListener::GetAddrInfoHandler::run() { 123007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick if (DBG) { 1247dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen ALOGD("GetAddrInfoHandler, now for %s / %s / %u / %u", mHost, mService, mNetId, mMark); 125007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 126007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 127007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick struct addrinfo* result = NULL; 1287dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen uint32_t rv = android_getaddrinfofornet(mHost, mService, mHints, mNetId, mMark, &result); 129ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun if (rv) { 130ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun // getaddrinfo failed 13140e0c13d6b77a9260b6da4c9e11cca8a5f994ea2Selim Gurun mClient->sendBinaryMsg(ResponseCode::DnsProxyOperationFailed, &rv, sizeof(rv)); 132ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun } else { 133ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun bool success = !mClient->sendCode(ResponseCode::DnsProxyQueryResult); 134007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick struct addrinfo* ai = result; 135007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick while (ai && success) { 136007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick success = sendLenAndData(mClient, sizeof(struct addrinfo), ai) 137007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick && sendLenAndData(mClient, ai->ai_addrlen, ai->ai_addr) 138007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick && sendLenAndData(mClient, 139007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick ai->ai_canonname ? strlen(ai->ai_canonname) + 1 : 0, 140007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick ai->ai_canonname); 141007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick ai = ai->ai_next; 142007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 143007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick success = success && sendLenAndData(mClient, 0, ""); 144ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun if (!success) { 145ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun ALOGW("Error writing DNS result to client"); 146ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun } 147007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 148007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick if (result) { 149007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick freeaddrinfo(result); 150007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 15134ffd85aed3838d53bd1136c751a7825de1940e0Brad Fitzpatrick mClient->decRef(); 152007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 153007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 1547dd69a1b0b95e67c8b939884476f2cf888026eb7Paul JensenDnsProxyListener::GetAddrInfoCmd::GetAddrInfoCmd(const DnsProxyListener* dnsProxyListener) : 155a0efaece8c05370f201efe099a537ceb014c6fdfSzymon Jakubczak NetdCommand("getaddrinfo"), 1567dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen mDnsProxyListener(dnsProxyListener) { 157007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 158007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 159007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrickint DnsProxyListener::GetAddrInfoCmd::runCommand(SocketClient *cli, 160007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick int argc, char **argv) { 1610475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom if (DBG) { 1620475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom for (int i = 0; i < argc; i++) { 1637b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("argv[%i]=%s", i, argv[i]); 1640475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom } 1650475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom } 16652b17bcfdf63a9d00f3ab1bc6ff738cbc4d30b0bNick Kralevich if (argc != 8) { 167ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun char* msg = NULL; 168ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun asprintf( &msg, "Invalid number of arguments to getaddrinfo: %i", argc); 169ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun ALOGW("%s", msg); 170ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun cli->sendMsg(ResponseCode::CommandParameterError, msg, false); 171ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun free(msg); 1720475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom return -1; 173007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 174007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 175007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick char* name = argv[1]; 176007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick if (strcmp("^", name) == 0) { 177007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick name = NULL; 178007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } else { 179007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick name = strdup(name); 180007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 181007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 182007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick char* service = argv[2]; 183007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick if (strcmp("^", service) == 0) { 184007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick service = NULL; 185007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } else { 186007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick service = strdup(service); 187007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 188007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 189007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick struct addrinfo* hints = NULL; 190007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick int ai_flags = atoi(argv[3]); 191007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick int ai_family = atoi(argv[4]); 192007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick int ai_socktype = atoi(argv[5]); 193007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick int ai_protocol = atoi(argv[6]); 194a0efaece8c05370f201efe099a537ceb014c6fdfSzymon Jakubczak unsigned netId = strtoul(argv[7], NULL, 10); 1953acdb064d8d5a86b1973fcda1e8dd83e0e12e0b3Chad Brubaker uid_t uid = cli->getUid(); 1962d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 1971011b4941d96d9fd90bc7243be387b63ec775936Sreeram Ramachandran uint32_t mark = mDnsProxyListener->mNetCtrl->getNetworkForDns(&netId, uid); 198be1e7d8c0e0abb37262770e2455176413a4b0f7fPaul Jensen 199007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick if (ai_flags != -1 || ai_family != -1 || 200007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick ai_socktype != -1 || ai_protocol != -1) { 201007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick hints = (struct addrinfo*) calloc(1, sizeof(struct addrinfo)); 202007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick hints->ai_flags = ai_flags; 203007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick hints->ai_family = ai_family; 204007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick hints->ai_socktype = ai_socktype; 205007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick hints->ai_protocol = ai_protocol; 206a0efaece8c05370f201efe099a537ceb014c6fdfSzymon Jakubczak 207a0efaece8c05370f201efe099a537ceb014c6fdfSzymon Jakubczak // Only implement AI_ADDRCONFIG if application is using default network since our 208a0efaece8c05370f201efe099a537ceb014c6fdfSzymon Jakubczak // implementation only works on the default network. 2097dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen if ((hints->ai_flags & AI_ADDRCONFIG) && 2107dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen netId != mDnsProxyListener->mNetCtrl->getDefaultNetwork()) { 211a0efaece8c05370f201efe099a537ceb014c6fdfSzymon Jakubczak hints->ai_flags &= ~AI_ADDRCONFIG; 212a0efaece8c05370f201efe099a537ceb014c6fdfSzymon Jakubczak } 213007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 214007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 215007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick if (DBG) { 2167dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen ALOGD("GetAddrInfoHandler for %s / %s / %u / %d / %u", 217007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick name ? name : "[nullhost]", 2182d4610ec34cc78799a3353638fa05ee53276892aMattias Falk service ? service : "[nullservice]", 2197dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen netId, uid, mark); 220007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick } 221007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 22234ffd85aed3838d53bd1136c751a7825de1940e0Brad Fitzpatrick cli->incRef(); 223007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick DnsProxyListener::GetAddrInfoHandler* handler = 2247dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen new DnsProxyListener::GetAddrInfoHandler(cli, name, service, hints, netId, mark); 225007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick handler->start(); 226007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick 227007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick return 0; 228007e987fee7e815e0c4bc820f434a632b7a69a9dBrad Fitzpatrick} 2291dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 2301dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk/******************************************************* 2312d4610ec34cc78799a3353638fa05ee53276892aMattias Falk * GetHostByName * 2322d4610ec34cc78799a3353638fa05ee53276892aMattias Falk *******************************************************/ 2337dd69a1b0b95e67c8b939884476f2cf888026eb7Paul JensenDnsProxyListener::GetHostByNameCmd::GetHostByNameCmd(const DnsProxyListener* dnsProxyListener) : 234a0efaece8c05370f201efe099a537ceb014c6fdfSzymon Jakubczak NetdCommand("gethostbyname"), 2357dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen mDnsProxyListener(dnsProxyListener) { 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 2543acdb064d8d5a86b1973fcda1e8dd83e0e12e0b3Chad Brubaker uid_t uid = cli->getUid(); 255a0efaece8c05370f201efe099a537ceb014c6fdfSzymon Jakubczak unsigned netId = strtoul(argv[1], NULL, 10); 25652b17bcfdf63a9d00f3ab1bc6ff738cbc4d30b0bNick Kralevich char* name = argv[2]; 25752b17bcfdf63a9d00f3ab1bc6ff738cbc4d30b0bNick Kralevich int af = atoi(argv[3]); 2582d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 2592d4610ec34cc78799a3353638fa05ee53276892aMattias Falk if (strcmp(name, "^") == 0) { 2602d4610ec34cc78799a3353638fa05ee53276892aMattias Falk name = NULL; 2612d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } else { 2622d4610ec34cc78799a3353638fa05ee53276892aMattias Falk name = strdup(name); 2632d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } 2642d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 2651011b4941d96d9fd90bc7243be387b63ec775936Sreeram Ramachandran uint32_t mark = mDnsProxyListener->mNetCtrl->getNetworkForDns(&netId, uid); 266a0efaece8c05370f201efe099a537ceb014c6fdfSzymon Jakubczak 2672d4610ec34cc78799a3353638fa05ee53276892aMattias Falk cli->incRef(); 2682d4610ec34cc78799a3353638fa05ee53276892aMattias Falk DnsProxyListener::GetHostByNameHandler* handler = 2697dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen new DnsProxyListener::GetHostByNameHandler(cli, name, af, netId, mark); 2702d4610ec34cc78799a3353638fa05ee53276892aMattias Falk handler->start(); 2712d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 2722d4610ec34cc78799a3353638fa05ee53276892aMattias Falk return 0; 2732d4610ec34cc78799a3353638fa05ee53276892aMattias Falk} 2742d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 2752d4610ec34cc78799a3353638fa05ee53276892aMattias FalkDnsProxyListener::GetHostByNameHandler::GetHostByNameHandler(SocketClient* c, 2762d4610ec34cc78799a3353638fa05ee53276892aMattias Falk char* name, 277d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker int af, 2787dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen unsigned netId, 2797dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen uint32_t mark) 2802d4610ec34cc78799a3353638fa05ee53276892aMattias Falk : mClient(c), 2812d4610ec34cc78799a3353638fa05ee53276892aMattias Falk mName(name), 282d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker mAf(af), 2837dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen mNetId(netId), 2847dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen mMark(mark) { 2852d4610ec34cc78799a3353638fa05ee53276892aMattias Falk} 2862d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 2872d4610ec34cc78799a3353638fa05ee53276892aMattias FalkDnsProxyListener::GetHostByNameHandler::~GetHostByNameHandler() { 2882d4610ec34cc78799a3353638fa05ee53276892aMattias Falk free(mName); 2892d4610ec34cc78799a3353638fa05ee53276892aMattias Falk} 2902d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 2912d4610ec34cc78799a3353638fa05ee53276892aMattias Falkvoid DnsProxyListener::GetHostByNameHandler::start() { 2922d4610ec34cc78799a3353638fa05ee53276892aMattias Falk pthread_t thread; 2932d4610ec34cc78799a3353638fa05ee53276892aMattias Falk pthread_create(&thread, NULL, 2942d4610ec34cc78799a3353638fa05ee53276892aMattias Falk DnsProxyListener::GetHostByNameHandler::threadStart, this); 2952d4610ec34cc78799a3353638fa05ee53276892aMattias Falk pthread_detach(thread); 2962d4610ec34cc78799a3353638fa05ee53276892aMattias Falk} 2972d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 2982d4610ec34cc78799a3353638fa05ee53276892aMattias Falkvoid* DnsProxyListener::GetHostByNameHandler::threadStart(void* obj) { 2992d4610ec34cc78799a3353638fa05ee53276892aMattias Falk GetHostByNameHandler* handler = reinterpret_cast<GetHostByNameHandler*>(obj); 3002d4610ec34cc78799a3353638fa05ee53276892aMattias Falk handler->run(); 3012d4610ec34cc78799a3353638fa05ee53276892aMattias Falk delete handler; 3022d4610ec34cc78799a3353638fa05ee53276892aMattias Falk pthread_exit(NULL); 3032d4610ec34cc78799a3353638fa05ee53276892aMattias Falk return NULL; 3042d4610ec34cc78799a3353638fa05ee53276892aMattias Falk} 3052d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 3062d4610ec34cc78799a3353638fa05ee53276892aMattias Falkvoid DnsProxyListener::GetHostByNameHandler::run() { 3072d4610ec34cc78799a3353638fa05ee53276892aMattias Falk if (DBG) { 3082d4610ec34cc78799a3353638fa05ee53276892aMattias Falk ALOGD("DnsProxyListener::GetHostByNameHandler::run\n"); 3092d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } 3102d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 3112d4610ec34cc78799a3353638fa05ee53276892aMattias Falk struct hostent* hp; 3122d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 3137dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen hp = android_gethostbynamefornet(mName, mAf, mNetId, mMark); 3142d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 3152d4610ec34cc78799a3353638fa05ee53276892aMattias Falk if (DBG) { 3162a54d96c5ae809216965e6f86e70cdae2ed7e09cMatthew Leach ALOGD("GetHostByNameHandler::run gethostbyname errno: %s hp->h_name = %s, name_len = %zu\n", 3172d4610ec34cc78799a3353638fa05ee53276892aMattias Falk hp ? "success" : strerror(errno), 3182a54d96c5ae809216965e6f86e70cdae2ed7e09cMatthew Leach (hp && hp->h_name) ? hp->h_name : "null", 3192a54d96c5ae809216965e6f86e70cdae2ed7e09cMatthew Leach (hp && hp->h_name) ? strlen(hp->h_name) + 1 : 0); 3202d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } 3212d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 3222d4610ec34cc78799a3353638fa05ee53276892aMattias Falk bool success = true; 3232d4610ec34cc78799a3353638fa05ee53276892aMattias Falk if (hp) { 3242d4610ec34cc78799a3353638fa05ee53276892aMattias Falk success = mClient->sendCode(ResponseCode::DnsProxyQueryResult) == 0; 3252d4610ec34cc78799a3353638fa05ee53276892aMattias Falk success &= sendhostent(mClient, hp); 3262d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } else { 3272d4610ec34cc78799a3353638fa05ee53276892aMattias Falk success = mClient->sendBinaryMsg(ResponseCode::DnsProxyOperationFailed, NULL, 0) == 0; 3282d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } 3292d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 3302d4610ec34cc78799a3353638fa05ee53276892aMattias Falk if (!success) { 3312d4610ec34cc78799a3353638fa05ee53276892aMattias Falk ALOGW("GetHostByNameHandler: Error writing DNS result to client\n"); 3322d4610ec34cc78799a3353638fa05ee53276892aMattias Falk } 3332d4610ec34cc78799a3353638fa05ee53276892aMattias Falk mClient->decRef(); 3342d4610ec34cc78799a3353638fa05ee53276892aMattias Falk} 3352d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 3362d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 3372d4610ec34cc78799a3353638fa05ee53276892aMattias Falk/******************************************************* 3382d4610ec34cc78799a3353638fa05ee53276892aMattias Falk * GetHostByAddr * 3391dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk *******************************************************/ 3407dd69a1b0b95e67c8b939884476f2cf888026eb7Paul JensenDnsProxyListener::GetHostByAddrCmd::GetHostByAddrCmd(const DnsProxyListener* dnsProxyListener) : 341a0efaece8c05370f201efe099a537ceb014c6fdfSzymon Jakubczak NetdCommand("gethostbyaddr"), 3427dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen mDnsProxyListener(dnsProxyListener) { 3431dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk} 3441dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 3451dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falkint DnsProxyListener::GetHostByAddrCmd::runCommand(SocketClient *cli, 3461dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk int argc, char **argv) { 3470475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom if (DBG) { 3480475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom for (int i = 0; i < argc; i++) { 3497b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("argv[%i]=%s", i, argv[i]); 3500475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom } 3510475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom } 35252b17bcfdf63a9d00f3ab1bc6ff738cbc4d30b0bNick Kralevich if (argc != 5) { 353ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun char* msg = NULL; 354ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun asprintf(&msg, "Invalid number of arguments to gethostbyaddr: %i", argc); 355ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun ALOGW("%s", msg); 356ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun cli->sendMsg(ResponseCode::CommandParameterError, msg, false); 357ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun free(msg); 3580475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom return -1; 3591dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk } 3601dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 3610475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom char* addrStr = argv[1]; 3621dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk int addrLen = atoi(argv[2]); 3631dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk int addrFamily = atoi(argv[3]); 3643acdb064d8d5a86b1973fcda1e8dd83e0e12e0b3Chad Brubaker uid_t uid = cli->getUid(); 365a0efaece8c05370f201efe099a537ceb014c6fdfSzymon Jakubczak unsigned netId = strtoul(argv[4], NULL, 10); 3661dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 3670475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom void* addr = malloc(sizeof(struct in6_addr)); 3680475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom errno = 0; 3690475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom int result = inet_pton(addrFamily, addrStr, addr); 3700475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom if (result <= 0) { 371ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun char* msg = NULL; 372ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun asprintf(&msg, "inet_pton(\"%s\") failed %s", addrStr, strerror(errno)); 373ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun ALOGW("%s", msg); 374ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun cli->sendMsg(ResponseCode::OperationFailed, msg, false); 3750475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom free(addr); 376ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun free(msg); 3770475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom return -1; 3780475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom } 3790475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom 3801011b4941d96d9fd90bc7243be387b63ec775936Sreeram Ramachandran uint32_t mark = mDnsProxyListener->mNetCtrl->getNetworkForDns(&netId, uid); 381a0efaece8c05370f201efe099a537ceb014c6fdfSzymon Jakubczak 38234ffd85aed3838d53bd1136c751a7825de1940e0Brad Fitzpatrick cli->incRef(); 3831dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk DnsProxyListener::GetHostByAddrHandler* handler = 3847dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen new DnsProxyListener::GetHostByAddrHandler(cli, addr, addrLen, addrFamily, netId, mark); 3851dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk handler->start(); 3861dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 3871dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk return 0; 3881dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk} 3891dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 3902d4610ec34cc78799a3353638fa05ee53276892aMattias FalkDnsProxyListener::GetHostByAddrHandler::GetHostByAddrHandler(SocketClient* c, 3912d4610ec34cc78799a3353638fa05ee53276892aMattias Falk void* address, 3922d4610ec34cc78799a3353638fa05ee53276892aMattias Falk int addressLen, 3932d4610ec34cc78799a3353638fa05ee53276892aMattias Falk int addressFamily, 3947dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen unsigned netId, 3957dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen uint32_t mark) 3962d4610ec34cc78799a3353638fa05ee53276892aMattias Falk : mClient(c), 3972d4610ec34cc78799a3353638fa05ee53276892aMattias Falk mAddress(address), 3982d4610ec34cc78799a3353638fa05ee53276892aMattias Falk mAddressLen(addressLen), 3992d4610ec34cc78799a3353638fa05ee53276892aMattias Falk mAddressFamily(addressFamily), 4007dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen mNetId(netId), 4017dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen mMark(mark) { 4022d4610ec34cc78799a3353638fa05ee53276892aMattias Falk} 4032d4610ec34cc78799a3353638fa05ee53276892aMattias Falk 4041dbd6cf148ea3fab57ec0644c336e94c78a488beMattias FalkDnsProxyListener::GetHostByAddrHandler::~GetHostByAddrHandler() { 4051dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk free(mAddress); 4061dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk} 4071dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 4081dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falkvoid DnsProxyListener::GetHostByAddrHandler::start() { 4090cdb680c7648b0f48e6513926cb0a06d290a5cbeJurijs Oniscuks pthread_t thread; 4100cdb680c7648b0f48e6513926cb0a06d290a5cbeJurijs Oniscuks pthread_create(&thread, NULL, 4111dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk DnsProxyListener::GetHostByAddrHandler::threadStart, this); 4122d4610ec34cc78799a3353638fa05ee53276892aMattias Falk pthread_detach(thread); 4131dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk} 4141dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 4151dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falkvoid* DnsProxyListener::GetHostByAddrHandler::threadStart(void* obj) { 4161dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk GetHostByAddrHandler* handler = reinterpret_cast<GetHostByAddrHandler*>(obj); 4171dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk handler->run(); 4181dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk delete handler; 4191dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk pthread_exit(NULL); 4201dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk return NULL; 4211dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk} 4221dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 4231dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falkvoid DnsProxyListener::GetHostByAddrHandler::run() { 4241dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk if (DBG) { 4257b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("DnsProxyListener::GetHostByAddrHandler::run\n"); 4261dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk } 4271dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk struct hostent* hp; 4281dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 4290475ae98cd8f45de815d67d1966edaf5997be9a9Brian Carlstrom // NOTE gethostbyaddr should take a void* but bionic thinks it should be char* 4307dd69a1b0b95e67c8b939884476f2cf888026eb7Paul Jensen hp = android_gethostbyaddrfornet((char*)mAddress, mAddressLen, mAddressFamily, mNetId, mMark); 4311dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 4321dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk if (DBG) { 4332a54d96c5ae809216965e6f86e70cdae2ed7e09cMatthew Leach ALOGD("GetHostByAddrHandler::run gethostbyaddr errno: %s hp->h_name = %s, name_len = %zu\n", 4341dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk hp ? "success" : strerror(errno), 4352a54d96c5ae809216965e6f86e70cdae2ed7e09cMatthew Leach (hp && hp->h_name) ? hp->h_name : "null", 4362a54d96c5ae809216965e6f86e70cdae2ed7e09cMatthew Leach (hp && hp->h_name) ? strlen(hp->h_name) + 1 : 0); 4371dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk } 4381dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 4392d4610ec34cc78799a3353638fa05ee53276892aMattias Falk bool success = true; 440ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun if (hp) { 4412d4610ec34cc78799a3353638fa05ee53276892aMattias Falk success = mClient->sendCode(ResponseCode::DnsProxyQueryResult) == 0; 4422d4610ec34cc78799a3353638fa05ee53276892aMattias Falk success &= sendhostent(mClient, hp); 443ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun } else { 4442d4610ec34cc78799a3353638fa05ee53276892aMattias Falk success = mClient->sendBinaryMsg(ResponseCode::DnsProxyOperationFailed, NULL, 0) == 0; 445ddb34755fb54882b3ece8d4919593e26a2c1cfcbSelim Gurun } 4461dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 4472d4610ec34cc78799a3353638fa05ee53276892aMattias Falk if (!success) { 4480e76b761a1514d5182675dd7b7d33725f62d6bc5Steve Block ALOGW("GetHostByAddrHandler: Error writing DNS result to client\n"); 4491dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk } 45034ffd85aed3838d53bd1136c751a7825de1940e0Brad Fitzpatrick mClient->decRef(); 4511dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk} 452