Chromium Code Reviews| 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..782929a00e7b4a6be8bdc7dad9561208aa16bc79 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)); |
| + 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); |
| + return (rv == 0) ? ssid : ""; |
| +} |
| + |
| bool GetNetworkListImpl( |
| NetworkInterfaceList* networks, |
| int policy, |
| @@ -172,6 +188,26 @@ 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) { |
| + LOG(ERROR) << "Interface " << i << ": " << interfaces[i].name; |
|
meacer
2015/02/04 01:34:33
Debug cruft, to be removed.
|
| + 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 +222,10 @@ bool GetNetworkList(NetworkInterfaceList* networks, int policy) { |
| &internal::AddressTrackerLinux::GetInterfaceName); |
| } |
| +std::string GetWifiSSIDFromInterfaceList( |
| + const NetworkInterfaceList& interfaces) { |
| + return internal::GetWifiSSIDFromInterfaceListInternal( |
| + interfaces, internal::GetInterfaceSSID); |
| +} |
| + |
| } // namespace net |