• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "proxy_resolver_js_bindings.h"
6 #include "proxy_resolver_v8.h"
7 
8 #include <netdb.h>
9 #include <unistd.h>
10 #include <cstddef>
11 #include <memory>
12 #include <string>
13 
14 #include "net_util.h"
15 
16 namespace net {
17 
18 // ProxyResolverJSBindings implementation.
19 class DefaultJSBindings : public ProxyResolverJSBindings {
20  public:
DefaultJSBindings()21   DefaultJSBindings() {
22   }
23 
24   // Handler for "myIpAddress()".
25   // TODO: Perhaps enumerate the interfaces directly, using
26   // getifaddrs().
MyIpAddress(std::string * first_ip_address)27   virtual bool MyIpAddress(std::string* first_ip_address) {
28     return MyIpAddressImpl(first_ip_address);
29   }
30 
31   // Handler for "myIpAddressEx()".
MyIpAddressEx(std::string * ip_address_list)32   virtual bool MyIpAddressEx(std::string* ip_address_list) {
33     return MyIpAddressExImpl(ip_address_list);
34   }
35 
36   // Handler for "dnsResolve(host)".
DnsResolve(const std::string & host,std::string * first_ip_address)37   virtual bool DnsResolve(const std::string& host,
38                           std::string* first_ip_address) {
39     return DnsResolveImpl(host, first_ip_address);
40   }
41 
42   // Handler for "dnsResolveEx(host)".
DnsResolveEx(const std::string & host,std::string * ip_address_list)43   virtual bool DnsResolveEx(const std::string& host,
44                             std::string* ip_address_list) {
45     return DnsResolveExImpl(host, ip_address_list);
46   }
47 
48  private:
MyIpAddressImpl(std::string * first_ip_address)49   bool MyIpAddressImpl(std::string* first_ip_address) {
50     std::string my_hostname = GetHostName();
51     if (my_hostname.empty())
52       return false;
53     return DnsResolveImpl(my_hostname, first_ip_address);
54   }
55 
MyIpAddressExImpl(std::string * ip_address_list)56   bool MyIpAddressExImpl(std::string* ip_address_list) {
57     std::string my_hostname = GetHostName();
58     if (my_hostname.empty())
59       return false;
60     return DnsResolveExImpl(my_hostname, ip_address_list);
61   }
62 
DnsResolveImpl(const std::string & host,std::string * first_ip_address)63   bool DnsResolveImpl(const std::string& host,
64                       std::string* first_ip_address) {
65     struct hostent* he = gethostbyname(host.c_str());
66 
67     if (he == NULL) {
68       return false;
69     }
70     *first_ip_address = std::string(he->h_addr);
71     return true;
72   }
73 
DnsResolveExImpl(const std::string & host,std::string * ip_address_list)74   bool DnsResolveExImpl(const std::string& host,
75                         std::string* ip_address_list) {
76     struct hostent* he = gethostbyname(host.c_str());
77 
78     if (he == NULL) {
79       return false;
80     }
81     std::string address_list_str;
82     for (char** addr = &he->h_addr; *addr != NULL; ++addr) {
83       if (!address_list_str.empty())
84         address_list_str += ";";
85       const std::string address_string = std::string(*addr);
86       if (address_string.empty())
87         return false;
88       address_list_str += address_string;
89     }
90     *ip_address_list = std::string(he->h_addr);
91     return true;
92   }
93 
GetHostName()94   std::string GetHostName() {
95     char buffer[256];
96     if (gethostname(buffer, 256) != 0) {
97       buffer[0] = '\0';
98     }
99     return std::string(buffer);
100   }
101 };
102 
103 // static
CreateDefault()104 ProxyResolverJSBindings* ProxyResolverJSBindings::CreateDefault() {
105   return new DefaultJSBindings();
106 }
107 
108 }  // namespace net
109