diff options
author | Thierry Vignaud <tvignaud@mandriva.org> | 2003-11-03 13:25:20 +0000 |
---|---|---|
committer | Thierry Vignaud <tvignaud@mandriva.org> | 2003-11-03 13:25:20 +0000 |
commit | 4dc3ecdfa9e591fbd9482a9c0b24f3217a3ec7e3 (patch) | |
tree | 9ad260c6bb1344692f63568002dfb31ca23e096c /perl-install/c | |
parent | e01c59488b87ae069d07532b1a356c56cc8a2ef6 (diff) | |
download | drakx-4dc3ecdfa9e591fbd9482a9c0b24f3217a3ec7e3.tar drakx-4dc3ecdfa9e591fbd9482a9c0b24f3217a3ec7e3.tar.gz drakx-4dc3ecdfa9e591fbd9482a9c0b24f3217a3ec7e3.tar.bz2 drakx-4dc3ecdfa9e591fbd9482a9c0b24f3217a3ec7e3.tar.xz drakx-4dc3ecdfa9e591fbd9482a9c0b24f3217a3ec7e3.zip |
ask the kernel the list of network devices instead of manually probing
everything (this enable to handle more than 4 ethernet cards)
Diffstat (limited to 'perl-install/c')
-rw-r--r-- | perl-install/c/stuff.xs.pl | 45 |
1 files changed, 33 insertions, 12 deletions
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) |