--- /dev/null
+#!/usr/bin/perl
+use strict;
+use warnings;
+require 'sys/ioctl.ph';
+use Socket;
+
+my %interfaces;
+my $max_addrs = 30;
+socket(my $socket, AF_INET, SOCK_DGRAM, 0) or die "socket: $!";
+
+{
+ my $ifreqpack = 'a16a16';
+ my $buf = pack($ifreqpack, '', '') x $max_addrs;
+ my $ifconf = pack('iP', length($buf), $buf);
+
+ # This does the actual work
+ ioctl($socket, SIOCGIFCONF(), $ifconf) or die "ioctl: $!";
+
+ my $len = unpack('iP', $ifconf);
+ substr($buf, $len) = '';
+
+ %interfaces = unpack("($ifreqpack)*", $buf);
+
+ unless (keys(%interfaces) < $max_addrs) {
+ # Buffer was too small
+ $max_addrs += 10;
+ redo;
+ }
+}
+
+for my $addr (values %interfaces) {
+ $addr = inet_ntoa((sockaddr_in($addr))[1]);
+}
+
+use Data::Dumper;
+print Dumper \%interfaces;