summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThierry Vignaud <thierry.vignaud@gmail.com>2016-07-01 17:33:43 +0200
committerThierry Vignaud <thierry.vignaud@gmail.com>2016-07-01 17:41:15 +0200
commitdca3a0bf7c1b807b8a568c436b0225f7c1c2762c (patch)
treecdc9a5fb952922b5d2f2dcdc8a8f7e0450bde2c5
parentbac52c60e891ed3e927b508729d04be720fd34d6 (diff)
downloaddrakx-dca3a0bf7c1b807b8a568c436b0225f7c1c2762c.tar
drakx-dca3a0bf7c1b807b8a568c436b0225f7c1c2762c.tar.gz
drakx-dca3a0bf7c1b807b8a568c436b0225f7c1c2762c.tar.bz2
drakx-dca3a0bf7c1b807b8a568c436b0225f7c1c2762c.tar.xz
drakx-dca3a0bf7c1b807b8a568c436b0225f7c1c2762c.zip
fix description of network interfaces (mga#15638)
It got broken when switching stage1 to udev: previously we were manually loading the driver and thus we knew which driver corresponded to the newly created intf. Since mga4, the driver has already been loaded by udev and thus we fail to associate the intf with the right driver and thus we failed to get the driver description. => let's use the ethtool IOCTL like the stage2 does
-rw-r--r--mdk-stage1/NEWS2
-rw-r--r--mdk-stage1/probing.c26
2 files changed, 23 insertions, 5 deletions
diff --git a/mdk-stage1/NEWS b/mdk-stage1/NEWS
index e24d81e07..0b4b73aab 100644
--- a/mdk-stage1/NEWS
+++ b/mdk-stage1/NEWS
@@ -1,3 +1,5 @@
+- fix description of network interfaces (mga#15638)
+
2.19
- recognize some missing wireless drivers (mga#16768)
diff --git a/mdk-stage1/probing.c b/mdk-stage1/probing.c
index 956038da2..b9420deb7 100644
--- a/mdk-stage1/probing.c
+++ b/mdk-stage1/probing.c
@@ -40,6 +40,8 @@
#include <fnmatch.h>
#include <sys/socket.h>
#include <net/if.h>
+#include <linux/sockios.h>
+#include <linux/ethtool.h>
#include <sys/ioctl.h>
#include <sys/mount.h>
#include <pci/pci.h>
@@ -125,11 +127,25 @@ void net_discovered_interface(char * intf_name)
char * get_net_intf_description(char * intf_name)
{
- int i;
- for (i = 0; i < net_descr_number ; i++)
- if (!strcmp(net_descriptions[i].intf_name, intf_name))
- return net_descriptions[i].intf_description;
- return strdup("unknown");
+ struct ifreq ifr;
+ struct ethtool_drvinfo drvinfo;
+ int s = socket(AF_INET, SOCK_DGRAM, 0);
+ char *res;
+
+ memset(&ifr, 0, sizeof(ifr));
+ strncpy(ifr.ifr_name, intf_name, IFNAMSIZ);
+
+ drvinfo.cmd = ETHTOOL_GDRVINFO;
+ ifr.ifr_data = (caddr_t) &drvinfo;
+
+ if (ioctl(s, SIOCETHTOOL, &ifr) != -1) {
+ res = drvinfo.driver;
+ } else {
+ perror("SIOCETHTOOL");
+ res = "unknown";
+ }
+ close(s);
+ return strdup(res);
}
#endif