Index: net/base/net_util_linux.cc |
diff --git a/net/base/net_util_linux.cc b/net/base/net_util_linux.cc |
index 36c9eb706ecfdaaa4d5cff4abdc73aac357795fd..0e894639d9d59619b362ac272a23208c499b42de 100644 |
--- a/net/base/net_util_linux.cc |
+++ b/net/base/net_util_linux.cc |
@@ -103,6 +103,22 @@ NetworkChangeNotifier::ConnectionType GetInterfaceConnectionType( |
return NetworkChangeNotifier::CONNECTION_UNKNOWN; |
} |
+std::string GetInterfaceSSID(const std::string& ifname) { |
+ int ioctl_socket = socket(AF_INET, SOCK_DGRAM, 0); |
+ if (ioctl_socket < 0) |
+ return ""; |
+ struct iwreq wreq; |
+ memset(&wreq, 0, sizeof(wreq)); |
pauljensen
2015/02/09 12:28:05
Can you combine these two lines like line 87?
meacer
2015/02/10 04:42:50
Done.
|
+ strncpy(wreq.ifr_name, ifname.c_str(), IFNAMSIZ - 1); |
+ |
+ char ssid[IW_ESSID_MAX_SIZE + 1] = {0}; |
+ wreq.u.essid.pointer = ssid; |
+ wreq.u.essid.length = IW_ESSID_MAX_SIZE; |
+ int rv = ioctl(ioctl_socket, SIOCGIWESSID, &wreq); |
+ close(ioctl_socket); |
pauljensen
2015/02/09 12:28:05
Can you eliminate this line using ScopedFD like li
meacer
2015/02/10 04:42:50
Good point, done.
|
+ return (rv == 0) ? ssid : ""; |
+} |
+ |
bool GetNetworkListImpl( |
NetworkInterfaceList* networks, |
int policy, |
@@ -172,6 +188,25 @@ bool GetNetworkListImpl( |
return true; |
} |
+std::string GetWifiSSIDFromInterfaceListInternal( |
+ const NetworkInterfaceList& interfaces, |
+ internal::GetInterfaceSSIDFunction get_interface_ssid) { |
+ std::string connected_ssid; |
+ bool first = true; |
+ for (size_t i = 0; i < interfaces.size(); ++i) { |
+ if (interfaces[i].type != NetworkChangeNotifier::CONNECTION_WIFI) |
+ return ""; |
+ std::string ssid = get_interface_ssid(interfaces[i].name); |
+ if (first) { |
+ first = false; |
+ connected_ssid = ssid; |
+ } else if (ssid != connected_ssid) { |
+ return ""; |
+ } |
+ } |
+ return connected_ssid; |
+} |
+ |
} // namespace internal |
bool GetNetworkList(NetworkInterfaceList* networks, int policy) { |
@@ -186,4 +221,13 @@ bool GetNetworkList(NetworkInterfaceList* networks, int policy) { |
&internal::AddressTrackerLinux::GetInterfaceName); |
} |
+std::string GetWifiSSID() { |
+ NetworkInterfaceList networks; |
+ if (GetNetworkList(&networks, net::INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES)) { |
+ return internal::GetWifiSSIDFromInterfaceListInternal( |
+ networks, internal::GetInterfaceSSID); |
+ } |
+ return ""; |
+} |
+ |
} // namespace net |