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 +++++++++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 12 deletions(-) (limited to 'perl-install/c/stuff.xs.pl') 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) -- cgit v1.2.1