DnsProxyListener.cpp revision 1dbd6cf148ea3fab57ec0644c336e94c78a488be
14e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick/* 24e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick * Copyright (C) 2010 The Android Open Source Project 34e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick * 44e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick * Licensed under the Apache License, Version 2.0 (the "License"); 54e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick * you may not use this file except in compliance with the License. 64e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick * You may obtain a copy of the License at 74e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick * 84e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick * http://www.apache.org/licenses/LICENSE-2.0 94e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick * 104e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick * Unless required by applicable law or agreed to in writing, software 114e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick * distributed under the License is distributed on an "AS IS" BASIS, 124e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick * See the License for the specific language governing permissions and 144e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick * limitations under the License. 154e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick */ 164e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick 174e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick#include <arpa/inet.h> 184e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick#include <dirent.h> 194e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick#include <errno.h> 204e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick#include <linux/if.h> 214e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick#include <netdb.h> 224e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick#include <netinet/in.h> 234e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick#include <stdlib.h> 244e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick#include <sys/socket.h> 254e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick#include <sys/types.h> 264e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick 274e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick#define LOG_TAG "DnsProxyListener" 284e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick#define DBG 0 294e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick 304e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick#include <cutils/log.h> 314e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick#include <sysutils/SocketClient.h> 324e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick 334e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick#include "DnsProxyListener.h" 344e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick 354e248e5a7a542067fd3f0467680eef2f92b1e195Brad FitzpatrickDnsProxyListener::DnsProxyListener() : 364e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick FrameworkListener("dnsproxyd") { 374e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick registerCmd(new GetAddrInfoCmd()); 381dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk registerCmd(new GetHostByAddrCmd()); 394e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick} 404e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick 414e248e5a7a542067fd3f0467680eef2f92b1e195Brad FitzpatrickDnsProxyListener::GetAddrInfoHandler::~GetAddrInfoHandler() { 424e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick free(mHost); 434e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick free(mService); 444e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick free(mHints); 454e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick} 464e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick 474e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrickvoid DnsProxyListener::GetAddrInfoHandler::start() { 484e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick pthread_create(&mThread, NULL, 494e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick DnsProxyListener::GetAddrInfoHandler::threadStart, this); 504e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick} 514e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick 524e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrickvoid* DnsProxyListener::GetAddrInfoHandler::threadStart(void* obj) { 534e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick GetAddrInfoHandler* handler = reinterpret_cast<GetAddrInfoHandler*>(obj); 544e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick handler->run(); 554e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick delete handler; 564e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick pthread_exit(NULL); 574e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick return NULL; 584e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick} 594e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick 604e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick// Sends 4 bytes of big-endian length, followed by the data. 614e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick// Returns true on success. 624e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrickstatic bool sendLenAndData(SocketClient *c, const int len, const void* data) { 634e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick uint32_t len_be = htonl(len); 6489b99f2375271f2020dbb41ae96afd8c17b8e11aBrad Fitzpatrick return c->sendData(&len_be, 4) == 0 && 6589b99f2375271f2020dbb41ae96afd8c17b8e11aBrad Fitzpatrick (len == 0 || c->sendData(data, len) == 0); 664e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick} 674e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick 684e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrickvoid DnsProxyListener::GetAddrInfoHandler::run() { 694e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick if (DBG) { 704e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick LOGD("GetAddrInfoHandler, now for %s / %s", mHost, mService); 714e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick } 724e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick 734e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick struct addrinfo* result = NULL; 744e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick int rv = getaddrinfo(mHost, mService, mHints, &result); 75df9a6a82700a14169cc9d0b74833f1e261b171c6Brad Fitzpatrick bool success = (mClient->sendData(&rv, sizeof(rv)) == 0); 764e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick if (rv == 0) { 774e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick struct addrinfo* ai = result; 784e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick while (ai && success) { 794e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick success = sendLenAndData(mClient, sizeof(struct addrinfo), ai) 804e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick && sendLenAndData(mClient, ai->ai_addrlen, ai->ai_addr) 814e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick && sendLenAndData(mClient, 824e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick ai->ai_canonname ? strlen(ai->ai_canonname) + 1 : 0, 834e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick ai->ai_canonname); 844e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick ai = ai->ai_next; 854e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick } 864e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick success = success && sendLenAndData(mClient, 0, ""); 874e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick } 884e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick if (result) { 894e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick freeaddrinfo(result); 904e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick } 914e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick if (!success) { 924e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick LOGW("Error writing DNS result to client"); 934e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick } 944e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick} 954e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick 964e248e5a7a542067fd3f0467680eef2f92b1e195Brad FitzpatrickDnsProxyListener::GetAddrInfoCmd::GetAddrInfoCmd() : 974e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick NetdCommand("getaddrinfo") { 984e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick} 994e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick 1004e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrickint DnsProxyListener::GetAddrInfoCmd::runCommand(SocketClient *cli, 1014e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick int argc, char **argv) { 1024e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick if (argc != 7) { 1034e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick LOGW("Invalid number of arguments to getaddrinfo"); 1044e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick return 0; 1054e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick } 1064e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick 1074e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick char* name = argv[1]; 1084e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick if (strcmp("^", name) == 0) { 1094e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick name = NULL; 1104e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick } else { 1114e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick name = strdup(name); 1124e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick } 1134e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick 1144e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick char* service = argv[2]; 1154e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick if (strcmp("^", service) == 0) { 1164e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick service = NULL; 1174e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick } else { 1184e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick service = strdup(service); 1194e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick } 1204e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick 1214e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick struct addrinfo* hints = NULL; 1224e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick int ai_flags = atoi(argv[3]); 1234e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick int ai_family = atoi(argv[4]); 1244e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick int ai_socktype = atoi(argv[5]); 1254e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick int ai_protocol = atoi(argv[6]); 1264e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick if (ai_flags != -1 || ai_family != -1 || 1274e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick ai_socktype != -1 || ai_protocol != -1) { 1284e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick hints = (struct addrinfo*) calloc(1, sizeof(struct addrinfo)); 1294e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick hints->ai_flags = ai_flags; 1304e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick hints->ai_family = ai_family; 1314e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick hints->ai_socktype = ai_socktype; 1324e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick hints->ai_protocol = ai_protocol; 1334e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick } 1344e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick 1354e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick if (DBG) { 1364e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick LOGD("GetAddrInfoHandler for %s / %s", 1374e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick name ? name : "[nullhost]", 1384e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick service ? service : "[nullservice]"); 1394e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick } 1404e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick 1414e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick DnsProxyListener::GetAddrInfoHandler* handler = 1424e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick new DnsProxyListener::GetAddrInfoHandler(cli, name, service, hints); 1434e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick handler->start(); 1444e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick 1454e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick 1464e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick return 0; 1474e248e5a7a542067fd3f0467680eef2f92b1e195Brad Fitzpatrick} 1481dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 1491dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk/******************************************************* 1501dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk * GetHostByAddr * 1511dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk *******************************************************/ 1521dbd6cf148ea3fab57ec0644c336e94c78a488beMattias FalkDnsProxyListener::GetHostByAddrCmd::GetHostByAddrCmd() : 1531dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk NetdCommand("gethostbyaddr") { 1541dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk} 1551dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 1561dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falkint DnsProxyListener::GetHostByAddrCmd::runCommand(SocketClient *cli, 1571dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk int argc, char **argv) { 1581dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk if (argc != 4) { 1591dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk LOGW("Invalid number of arguments to gethostbyaddr"); 1601dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk return 0; 1611dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk } 1621dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 1631dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk char* addr = argv[1]; 1641dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk addr = strdup(addr); 1651dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 1661dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk int addrLen = atoi(argv[2]); 1671dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk int addrFamily = atoi(argv[3]); 1681dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 1691dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk DnsProxyListener::GetHostByAddrHandler* handler = 1701dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk new DnsProxyListener::GetHostByAddrHandler(cli, addr, addrLen, addrFamily); 1711dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk handler->start(); 1721dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 1731dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk return 0; 1741dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk} 1751dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 1761dbd6cf148ea3fab57ec0644c336e94c78a488beMattias FalkDnsProxyListener::GetHostByAddrHandler::~GetHostByAddrHandler() { 1771dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk free(mAddress); 1781dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk} 1791dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 1801dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falkvoid DnsProxyListener::GetHostByAddrHandler::start() { 1811dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk pthread_create(&mThread, NULL, 1821dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk DnsProxyListener::GetHostByAddrHandler::threadStart, this); 1831dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk} 1841dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 1851dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falkvoid* DnsProxyListener::GetHostByAddrHandler::threadStart(void* obj) { 1861dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk GetHostByAddrHandler* handler = reinterpret_cast<GetHostByAddrHandler*>(obj); 1871dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk handler->run(); 1881dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk delete handler; 1891dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk pthread_exit(NULL); 1901dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk return NULL; 1911dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk} 1921dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 1931dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falkvoid DnsProxyListener::GetHostByAddrHandler::run() { 1941dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk if (DBG) { 1951dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk LOGD("DnsProxyListener::GetHostByAddrHandler::run\n"); 1961dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk if (mAddress) { 1971dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk LOGD("mAdress %u.%u.%u.%u mAdressLen %d, mAddressFamily %d", 1981dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk mAddress[0], mAddress[1], mAddress[2], mAddress[3], 1991dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk mAddressLen, mAddressFamily); 2001dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk } 2011dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk else { 2021dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk LOGD("mAddress = NULL"); 2031dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk } 2041dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk } 2051dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 2061dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk struct hostent* hp; 2071dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 2081dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk hp = gethostbyaddr(mAddress, mAddressLen, mAddressFamily); 2091dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 2101dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk if (DBG) { 2111dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk LOGD("GetHostByAddrHandler::run gethostbyaddr errno: %s hp->h_name = %s, name_len = %d\n", 2121dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk hp ? "success" : strerror(errno), 2131dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk (hp && hp->h_name) ? hp->h_name: "null", 2141dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk (hp && hp->h_name) ? strlen(hp->h_name)+ 1 : 0); 2151dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk } 2161dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 2171dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk bool success = sendLenAndData(mClient, (hp && hp->h_name) ? strlen(hp->h_name)+ 1 : 0, 2181dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk (hp && hp->h_name) ? hp->h_name : ""); 2191dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk 2201dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk if (!success) { 2211dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk LOGW("GetHostByAddrHandler: Error writing DNS result to client\n"); 2221dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk } 2231dbd6cf148ea3fab57ec0644c336e94c78a488beMattias Falk} 224