From 03c55a5b314a8281270e461b16c2954aaa762ec7 Mon Sep 17 00:00:00 2001 From: "A. Wilcox" Date: Thu, 14 Nov 2019 12:37:08 -0600 Subject: Qt UI: Factor MAC address into base interface list --- ui/qt5/horizonwizard.cc | 38 ++++++++++++++++++++++++++++++++------ ui/qt5/horizonwizard.hh | 7 ++++++- ui/qt5/networkifacepage.cc | 33 +++------------------------------ ui/qt5/networkingpage.cc | 2 +- 4 files changed, 42 insertions(+), 38 deletions(-) diff --git a/ui/qt5/horizonwizard.cc b/ui/qt5/horizonwizard.cc index dda631f..67ed193 100644 --- a/ui/qt5/horizonwizard.cc +++ b/ui/qt5/horizonwizard.cc @@ -21,6 +21,9 @@ #ifdef HAS_INSTALL_ENV # include +# include /* ifreq */ +# include /* ioctl */ +# include /* close */ #endif /* HAS_INSTALL_ENV */ #include "intropage.hh" @@ -63,13 +66,13 @@ static std::map help_id_map = { #ifdef HAS_INSTALL_ENV -std::map probe_ifaces(void) { +std::map probe_ifaces(void) { struct udev *udev; struct udev_enumerate *if_list; struct udev_list_entry *first, *candidate; struct udev_device *device = nullptr; - std::map ifaces; + std::map ifaces; udev = udev_new(); if(udev == nullptr) { @@ -90,6 +93,7 @@ std::map probe_ifaces(void) { udev_list_entry_foreach(candidate, first) { const char *syspath = udev_list_entry_get_name(candidate); const char *devtype, *cifname; + QString mac; if(device != nullptr) udev_device_unref(device); device = udev_device_new_from_syspath(udev, syspath); @@ -109,18 +113,40 @@ std::map probe_ifaces(void) { continue; } + /* Retrieving the index is always valid, and is not even privileged. */ + struct ifreq request; + int my_sock = ::socket(AF_INET, SOCK_STREAM, 0); + if(my_sock != -1) { + memset(&request, 0, sizeof(request)); + memcpy(&request.ifr_name, cifname, strlen(cifname)); + errno = 0; + if(ioctl(my_sock, SIOCGIFHWADDR, &request) != -1) { + char *buf; + asprintf(&buf, "%02X:%02X:%02X:%02X:%02X:%02X", + request.ifr_ifru.ifru_hwaddr.sa_data[0], + request.ifr_ifru.ifru_hwaddr.sa_data[1], + request.ifr_ifru.ifru_hwaddr.sa_data[2], + request.ifr_ifru.ifru_hwaddr.sa_data[3], + request.ifr_ifru.ifru_hwaddr.sa_data[4], + request.ifr_ifru.ifru_hwaddr.sa_data[5]); + mac = QString(buf); + free(buf); + } + ::close(my_sock); + } + std::string ifname(cifname); if(strstr(devtype, "wlan")) { - ifaces.insert({ifname, HorizonWizard::Wireless}); + ifaces.insert({ifname, {HorizonWizard::Wireless, mac}}); } else if(strstr(devtype, "bond")) { - ifaces.insert({ifname, HorizonWizard::Bonded}); + ifaces.insert({ifname, {HorizonWizard::Bonded, mac}}); } else if(strstr(syspath, "/virtual/")) { /* Skip lo, tuntap, etc */ continue; } else if(strstr(devtype, "1")) { - ifaces.insert({ifname, HorizonWizard::Ethernet}); + ifaces.insert({ifname, {HorizonWizard::Ethernet, mac}}); } else { - ifaces.insert({ifname, HorizonWizard::Unknown}); + ifaces.insert({ifname, {HorizonWizard::Unknown, mac}}); } } diff --git a/ui/qt5/horizonwizard.hh b/ui/qt5/horizonwizard.hh index d6f84cd..b999daf 100644 --- a/ui/qt5/horizonwizard.hh +++ b/ui/qt5/horizonwizard.hh @@ -58,10 +58,15 @@ public: Unknown }; + struct NetworkInterface { + NetworkInterfaceType type; + QString mac; + }; + HorizonWizard(QWidget *parent = nullptr); QShortcut *f1, *f3, *f5, *f8; - std::map interfaces; + std::map interfaces; std::string chosen_auto_iface; }; diff --git a/ui/qt5/networkifacepage.cc b/ui/qt5/networkifacepage.cc index f850cfd..4d292fb 100644 --- a/ui/qt5/networkifacepage.cc +++ b/ui/qt5/networkifacepage.cc @@ -13,12 +13,6 @@ #include "networkifacepage.hh" #include "horizonwizard.hh" -#ifdef HAS_INSTALL_ENV -# include /* ifreq */ -# include /* ioctl */ -# include /* close */ -#endif - #include #include #include @@ -58,7 +52,7 @@ void NetworkIfacePage::initializePage() { QString ifaceDevName = QString::fromStdString(iface.first); QString ifaceName; - switch(iface.second) { + switch(iface.second.type) { case HorizonWizard::Wireless: ifaceIcon = QIcon::fromTheme("network-wireless"); ifaceName = tr("Wi-Fi (%1)").arg(ifaceDevName); @@ -79,28 +73,7 @@ void NetworkIfacePage::initializePage() { QListWidgetItem *item = new QListWidgetItem(ifaceIcon, ifaceName, ifaceList); - /* Retrieving the index is always valid, and is not even privileged. */ - struct ifreq request; - int my_sock = ::socket(AF_INET, SOCK_STREAM, 0); - if(my_sock == -1) { - continue; - } - memset(&request, 0, sizeof(request)); - memcpy(&request.ifr_name, iface.first.c_str(), iface.first.size()); - errno = 0; - if(ioctl(my_sock, SIOCGIFHWADDR, &request) != -1) { - char *buf; - asprintf(&buf, "%02X:%02X:%02X:%02X:%02X:%02X", - request.ifr_ifru.ifru_hwaddr.sa_data[0], - request.ifr_ifru.ifru_hwaddr.sa_data[1], - request.ifr_ifru.ifru_hwaddr.sa_data[2], - request.ifr_ifru.ifru_hwaddr.sa_data[3], - request.ifr_ifru.ifru_hwaddr.sa_data[4], - request.ifr_ifru.ifru_hwaddr.sa_data[5]); - item->setToolTip(QString(buf)); - free(buf); - } - ::close(my_sock); + item->setToolTip(iface.second.mac); } layout = new QVBoxLayout; @@ -119,7 +92,7 @@ int NetworkIfacePage::nextId() const { auto iterator = horizonWizard()->interfaces.begin(); std::advance(iterator, ifaceList->currentRow()); - switch(iterator->second) { + switch(iterator->second.type) { case HorizonWizard::Wireless: return HorizonWizard::Page_Network_Wireless; default: diff --git a/ui/qt5/networkingpage.cc b/ui/qt5/networkingpage.cc index 8379877..86f8aff 100644 --- a/ui/qt5/networkingpage.cc +++ b/ui/qt5/networkingpage.cc @@ -80,7 +80,7 @@ int NetworkingPage::nextId() const { } else { horizonWizard()->chosen_auto_iface = (horizonWizard()->interfaces.begin())->first; - if((horizonWizard()->interfaces.begin())->second + if((horizonWizard()->interfaces.begin())->second.type == HorizonWizard::Wireless) { return HorizonWizard::Page_Network_Wireless; } else { -- cgit v1.2.3-60-g2f50