summaryrefslogtreecommitdiffstats
path: root/net/base/net_util_win.cc
diff options
context:
space:
mode:
authorsergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-19 00:36:39 +0000
committersergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-19 00:36:39 +0000
commit611cc90419870d40c0048c01ce72def49b8b5dd3 (patch)
tree264a4f257f9d2906f1d7d75e47154b014312af7f /net/base/net_util_win.cc
parent35d94587215848ac4ec0dbeceaa4e86a7657f7ae (diff)
downloadchromium_src-611cc90419870d40c0048c01ce72def49b8b5dd3.zip
chromium_src-611cc90419870d40c0048c01ce72def49b8b5dd3.tar.gz
chromium_src-611cc90419870d40c0048c01ce72def49b8b5dd3.tar.bz2
Add GetNetworkList() in net_utils.
BUG=None TEST=Unittests. Review URL: http://codereview.chromium.org/6676027 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@78780 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/base/net_util_win.cc')
-rw-r--r--net/base/net_util_win.cc60
1 files changed, 57 insertions, 3 deletions
diff --git a/net/base/net_util_win.cc b/net/base/net_util_win.cc
index dac93a9..ee6a5af 100644
--- a/net/base/net_util_win.cc
+++ b/net/base/net_util_win.cc
@@ -1,18 +1,24 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include <algorithm>
-
#include "net/base/net_util.h"
+#include <iphlpapi.h>
+
+#include <algorithm>
+
#include "base/file_path.h"
+#include "base/scoped_ptr.h"
#include "base/string_piece.h"
#include "base/string_util.h"
#include "base/sys_string_conversions.h"
+#include "base/threading/thread_restrictions.h"
#include "base/utf_string_conversions.h"
#include "googleurl/src/gurl.h"
#include "net/base/escape.h"
+#include "net/base/ip_endpoint.h"
+#include "net/base/net_errors.h"
namespace net {
@@ -69,4 +75,52 @@ bool FileURLToFilePath(const GURL& url, FilePath* file_path) {
return true;
}
+bool GetNetworkList(NetworkInterfaceList* networks) {
+ // GetAdaptersAddresses() may require IO operations.
+ base::ThreadRestrictions::AssertIOAllowed();
+
+ IP_ADAPTER_ADDRESSES info_temp;
+ ULONG len = 0;
+
+ // First get number of networks.
+ ULONG result = GetAdaptersAddresses(AF_UNSPEC, 0, NULL, &info_temp, &len);
+ if (result != ERROR_BUFFER_OVERFLOW) {
+ // There are 0 networks.
+ return true;
+ }
+
+ scoped_array<char> buf(new char[len]);
+ IP_ADAPTER_ADDRESSES *adapters =
+ reinterpret_cast<IP_ADAPTER_ADDRESSES *>(buf.get());
+ result = GetAdaptersAddresses(AF_UNSPEC, 0, NULL, adapters, &len);
+ if (result != NO_ERROR) {
+ LOG(ERROR) << "GetAdaptersAddresses failed: " << result;
+ return false;
+ }
+
+ for (IP_ADAPTER_ADDRESSES *adapter = adapters; adapter != NULL;
+ adapter = adapter->Next) {
+ // Ignore the loopback device.
+ if (adapter->IfType == IF_TYPE_SOFTWARE_LOOPBACK) {
+ continue;
+ }
+
+ IP_ADAPTER_UNICAST_ADDRESS* address;
+ for (address = adapter->FirstUnicastAddress; address != NULL;
+ address = address->Next) {
+ int family = address->Address.lpSockaddr->sa_family;
+ if (family == AF_INET || family == AF_INET6) {
+ IPEndPoint endpoint;
+ if (endpoint.FromSockAddr(address->Address.lpSockaddr,
+ address->Address.iSockaddrLength)) {
+ std::string name = adapter->AdapterName;
+ networks->push_back(NetworkInterface(name, endpoint.address()));
+ }
+ }
+ }
+ }
+
+ return true;
+}
+
} // namespace net