#!/usr/bin/perl -w

package myips;

use Socket;

require 'sys/ioctl.ph';
require 'sys/types.ph';

# These should all be defined elsewhere.  Sigh.
sub IF_NAMESIZE { 16; }
sub IFNAMSIZ { &IF_NAMESIZE; }
sub sizeof_IFR_ADDR { 16; }
sub sizeof_IFR_PADDING { __WORDSIZE() == 64 ? 8 : 0; }
sub sizeof_IFREQ { &IFNAMSIZ + &sizeof_IFR_ADDR + &sizeof_IFR_PADDING; }

sub get () {
    my $bufsiz = 1024;
    my $buf = "\0" x $bufsiz;
    my $ifc = pack "JP", $bufsiz, $buf;

    socket(S, PF_INET, SOCK_DGRAM, 0) || return;

    ioctl(S, &SIOCGIFCONF, $ifc) || do { close(S); return };

    close(S);

    my %ifaddrs = ();

    my $ifclen = unpack "J", $ifc;

    for (my $i = 0; $i < $ifclen; $i += &sizeof_IFREQ) {
        my $packfmt = sprintf '@%dZ%da%d', $i, &IFNAMSIZ, &sizeof_IFR_ADDR;

        my ($name, $ifr_addr) = unpack($packfmt, $buf);
        my ($port, $addr) = sockaddr_in($ifr_addr);

        $ifaddrs{$name} = inet_ntoa($addr);
    }

    %ifaddrs;
}

sub isunroutable ($)
{
    my $addr = shift;

    $addr = unpack('N', inet_aton($addr));

    ((($addr & 0xff000000) == 0x0a000000)
    || (($addr & 0xfff00000) == 0xac100000)
    || (($addr & 0xffff0000) == 0xc0a80000));
}

1;

