X-Git-Url: http://lab.mitty.jp/git/?a=blobdiff_plain;ds=sidebyside;f=.bin%2Fget_ip_from_ioctl.pl;fp=.bin%2Fget_ip_from_ioctl.pl;h=151b506845c34a37453b5481d6e0a22fc5079986;hb=df4fa7ba97367054d8073e9f9626b28d8936d941;hp=0000000000000000000000000000000000000000;hpb=57d3e5400ce51f1881320585b520bc5f88f004ce;p=lab.git diff --git a/.bin/get_ip_from_ioctl.pl b/.bin/get_ip_from_ioctl.pl new file mode 100755 index 0000000..151b506 --- /dev/null +++ b/.bin/get_ip_from_ioctl.pl @@ -0,0 +1,36 @@ +#!/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;