From 4dc3ecdfa9e591fbd9482a9c0b24f3217a3ec7e3 Mon Sep 17 00:00:00 2001 From: Thierry Vignaud Date: Mon, 3 Nov 2003 13:25:20 +0000 Subject: ask the kernel the list of network devices instead of manually probing everything (this enable to handle more than 4 ethernet cards) --- perl-install/c/stuff.xs.pl | 45 +++++++++++++++++++++++++++++++----------- perl-install/detect_devices.pm | 3 +-- 2 files changed, 34 insertions(+), 14 deletions(-) (limited to 'perl-install') diff --git a/perl-install/c/stuff.xs.pl b/perl-install/c/stuff.xs.pl index ca73bfb65..422c96069 100644 --- a/perl-install/c/stuff.xs.pl +++ b/perl-install/c/stuff.xs.pl @@ -395,20 +395,41 @@ usb_probe() unsigned int getpagesize() -int -hasNetDevice(device) - char * device - CODE: - struct ifreq req; - int s = socket(AF_INET, SOCK_DGRAM, 0); - if (s == -1) { RETVAL = 0; return; } +void +getNetInterfaces() + PPCODE: + struct ifconf ifc; + struct ifreq *ifr; + int fd, n; + + if ((fd = socket (PF_INET, SOCK_DGRAM, 0)) == -1) { + perror("getNetInterfaces() >> creating socket"); + XSRETURN_EMPTY; + } - strcpy(req.ifr_name, device); + // SIOCGIFCOUNT is unimplemented, let\'s call SIOCGIFCONF(0) to get number of interfaces + ifc.ifc_len = 0; ifc.ifc_buf = NULL; ifc.ifc_req = NULL; + if (ioctl (fd, SIOCGIFCONF, &ifc) == -1) { + perror("getNetInterfaces() >> SIOCGIFCONF(0)"); + XSRETURN_EMPTY; + } + + // allocate enough space + n = ifc.ifc_len / sizeof (struct ifreq); + New (0xbad, ifr, ifc.ifc_len, struct ifreq); + + // Get the network interfaces list + ifc.ifc_req = ifr; + if (ioctl (fd, SIOCGIFCONF, &ifc) == -1) { + perror("getNetInterfaces() >> SIOCGIFCONF()"); + XSRETURN_EMPTY; + } + + EXTEND(SP, n); + for (; n; --n, ++ifr) + PUSHs(sv_2mortal(newSVpv(ifr->ifr_name, 0))); + Safefree (ifc.ifc_req); - RETVAL = ioctl(s, SIOCGIFFLAGS, &req) == 0; - close(s); - OUTPUT: - RETVAL int addDefaultRoute(gateway) diff --git a/perl-install/detect_devices.pm b/perl-install/detect_devices.pm index edd586655..455269ba4 100644 --- a/perl-install/detect_devices.pm +++ b/perl-install/detect_devices.pm @@ -16,7 +16,6 @@ use c; #-##################################################################################### #- Globals #-##################################################################################### -my @netdevices = map { my $l = $_; map { "$l$_" } (0..3) } qw(eth tr fddi plip); my %serialprobe; #-###################################################################################### @@ -418,7 +417,7 @@ sub getSagem() { } sub getNet() { - grep { !(($::isStandalone || $::live) && /plip/) && c::hasNetDevice($_) } @netdevices; + grep { /^(eth|fddi|plip|tr|wifi|wlan)/ } c::getNetInterfaces(); } #sub getISDN() { -- cgit v1.2.1