diff options
Diffstat (limited to 'perl-install/c/stuff.xs.pl')
-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) |