Index: net/base/net_util_posix.cc |
diff --git a/net/base/net_util_posix.cc b/net/base/net_util_posix.cc |
index 904d8028bc26e22d76bc05bda11705838d010326..50ff6e7a4181160c202910d31892240a243001f5 100644 |
--- a/net/base/net_util_posix.cc |
+++ b/net/base/net_util_posix.cc |
@@ -9,6 +9,7 @@ |
#include "base/files/file_path.h" |
#include "base/logging.h" |
#include "base/posix/eintr_wrapper.h" |
+#include "base/strings/string_number_conversions.h" |
#include "base/strings/string_tokenizer.h" |
#include "base/strings/string_util.h" |
#include "base/threading/thread_restrictions.h" |
@@ -66,24 +67,33 @@ bool FileURLToFilePath(const GURL& url, base::FilePath* path) { |
bool GetNetworkList(NetworkInterfaceList* networks) { |
#if defined(OS_ANDROID) |
std::string network_list = android::GetNetworkList(); |
- base::StringTokenizer network_interfaces(network_list, ";"); |
+ base::StringTokenizer network_interfaces(network_list, "\n"); |
while (network_interfaces.GetNext()) { |
std::string network_item = network_interfaces.token(); |
- base::StringTokenizer network_tokenizer(network_item, ","); |
- std::string name; |
- if (!network_tokenizer.GetNext()) |
- continue; |
- name = network_tokenizer.token(); |
+ base::StringTokenizer network_tokenizer(network_item, "\t"); |
+ CHECK(network_tokenizer.GetNext()); |
+ std::string name = network_tokenizer.token(); |
- std::string literal_address; |
- if (!network_tokenizer.GetNext()) |
- continue; |
- literal_address = network_tokenizer.token(); |
+ CHECK(network_tokenizer.GetNext()); |
+ std::string interface_address = network_tokenizer.token(); |
+ |
+ base::StringTokenizer address_tokenizer(interface_address, "/"); |
+ |
+ CHECK(address_tokenizer.GetNext()); |
+ std::string literal_address = address_tokenizer.token(); |
+ |
+ CHECK(address_tokenizer.GetNext()); |
+ std::string network_prefix = address_tokenizer.token(); |
IPAddressNumber address; |
- if (!ParseIPLiteralToNumber(literal_address, &address)) |
- continue; |
- networks->push_back(NetworkInterface(name, address)); |
+ CHECK(ParseIPLiteralToNumber(literal_address, &address)); |
+ |
+ unsigned net_mask = 0; |
+ CHECK(base::StringToUint(network_prefix, &net_mask)); |
+ CHECK_LE(net_mask, address.size() * 8); |
+ |
+ networks->push_back( |
+ NetworkInterface(name, address, static_cast<uint8>(net_mask))); |
} |
return true; |
#else |
@@ -133,10 +143,19 @@ bool GetNetworkList(NetworkInterfaceList* networks) { |
// Skip non-IP addresses. |
continue; |
} |
+ |
IPEndPoint address; |
std::string name = interface->ifa_name; |
if (address.FromSockAddr(addr, addr_size)) { |
- networks->push_back(NetworkInterface(name, address.address())); |
+ uint8 net_mask = 0; |
+ if (interface->ifa_netmask) { |
+ IPEndPoint netmask; |
+ if (netmask.FromSockAddr(interface->ifa_netmask, addr_size)) { |
+ net_mask = MaskPrefixLength(netmask.address()); |
+ } |
+ } |
+ |
+ networks->push_back(NetworkInterface(name, address.address(), net_mask)); |
} |
} |