Chromium Code Reviews| 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..7165d0701b887c7bc0fc12c0fb844bbce3c589f2 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" |
| @@ -69,21 +70,27 @@ bool GetNetworkList(NetworkInterfaceList* networks) { |
| base::StringTokenizer network_interfaces(network_list, ";"); |
| while (network_interfaces.GetNext()) { |
| std::string network_item = network_interfaces.token(); |
| - base::StringTokenizer network_tokenizer(network_item, ","); |
| + base::StringTokenizer network_tokenizer(network_item, "/"); |
| std::string name; |
| - if (!network_tokenizer.GetNext()) |
| - continue; |
| + CHECK(network_tokenizer.GetNext()); |
| name = network_tokenizer.token(); |
| std::string literal_address; |
| - if (!network_tokenizer.GetNext()) |
| - continue; |
| + CHECK(network_tokenizer.GetNext()); |
| literal_address = network_tokenizer.token(); |
| + std::string network_prefix; |
| + CHECK(network_tokenizer.GetNext()); |
| + network_prefix = network_tokenizer.token(); |
| + |
| + unsigned net_mask = 0; |
| + CHECK(base::StringToUint(network_tokenizer.token(), &net_mask)); |
| + CHECK(net_mask <= 255); |
|
szym
2013/09/23 19:58:42
CHECK_LE
Vitaly Buka (NO REVIEWS)
2013/09/23 20:06:11
Done.
|
| + |
| IPAddressNumber address; |
| - if (!ParseIPLiteralToNumber(literal_address, &address)) |
| - continue; |
| - networks->push_back(NetworkInterface(name, address)); |
| + CHECK(ParseIPLiteralToNumber(literal_address, &address)); |
| + networks->push_back( |
| + NetworkInterface(name, address, static_cast<uint8>(net_mask))); |
| } |
| return true; |
| #else |
| @@ -133,10 +140,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)); |
| } |
| } |