Net-Interface

 view release on metacpan or  search on metacpan

t/faceinfo.t  view on Meta::CPAN

sub getflags {
  my($flags) = @_;
  no strict;
  my $txt = ($flags & IFF_UP) ? '<up ' : '<down ';
  foreach(sort @{$Net::Interface::EXPORT_TAGS{iffs}}) {
    my $x = eval { &$_(); };
    my $v = 0 + $x;
    next if $v == IFF_UP;
    $txt .= $x .' ' if $flags & $v;
  }
  chop $txt;
  $txt .= '>';
}

sub addr42txt {
  my($txt,$naddr) = @_;
  return '' unless $naddr;
  $txt .= ' '. inet_ntoa($naddr);
}

sub dumpaddrs {
  my($hvp,$i,$fam,$mac) = @_;
  my $key = 0 + $fam;
  if (exists $i->{$key}) {
    diag(sprintf("\t%s %d, addr size %d %s\n",$fam,$i->{$key}->{number},$i->{$key}->{size},$$mac));
    $$mac = '';
    my @address = $hvp->address($key);
    my @netmask = $hvp->netmask($key);
    my @broadcast = $hvp->broadcast($key);
    if ($key == AF_INET()) {
      foreach(0..$#address) {
	diag(sprintf("\t%s %s %s\n",
		addr42txt('addr',scalar $hvp->address($key,$_)),
		addr42txt('netmask',scalar $hvp->netmask($key,$_)),
		addr42txt('broadcast',scalar $hvp->broadcast($key,$_))
	));
      }
    } else {
      foreach(0..$#address) {
	diag(sprintf("\t%s/%d <%s>\n",
		inet_ntop($address[$_]),
		$hvp->mask2cidr($netmask[$_]),
		typetxt($hvp->type($address[$_])) ."\b"
	));
      }
    }
  }
}

foreach my $hvp (@ifaces) {
  my $i = $hvp->info();
  unless (defined $i->{flags} && $i->{flags} & IFF_UP()) {
    diag(sprintf("%s\t<DOWN>\n",$i->{name}));
    next;
  }
##  Dump($i);
  my $flags = getflags($i->{flags});
  my $mac = (defined $i->{mac}) ? "\tMAC: ". mac_bin2hex($i->{mac}) : '';
  my $mtu = $i->{mtu} ? 'MTU:'. $i->{mtu} : '';
  my $metric = (defined $i->{metric}) ? 'Metric:'. $i->{metric} : '';
  my $af_inet6 = eval {AF_INET6} || 0;
  diag(sprintf("%s id %d\tflags:0x%02x%s %s %s\n",$i->{name},$i->{index},$i->{flags},$flags,$mtu,$metric));
  dumpaddrs($hvp,$i,AF_INET,\$mac);
  dumpaddrs($hvp,$i,$af_inet6,\$mac);

#  print Dumper($i),"\n";
}



( run in 0.627 second using v1.01-cache-2.11-cpan-39bf76dae61 )