#!/usr/bin/perl -w
#	list-iface-net 0.03
#
#	Copyright (C) 2000:	Manel Marin <manel3@wanadoo.es>
#	Licence:		GNU GPL version >= 2
#
#
#	Devuelve las red/mascara de los interfaces que se le dan como parmetros
#
#	Uso:	list-iface-net ppp0 eth, list-iface-net all
#
#
#	------
#	Returns net/mask of interfaces given as parameters
#
#	Use:	list-iface-net ppp0 eth, list-iface-net all
#

# SALIDA DE ifconfig (Bcast: no sale en iface lo)
#
#eth0      Link encap:Ethernet  HWaddr 00:80:AD:20:D7:C0
#	   inet addr:192.168.0.1  Bcast:192.168.0.255  Mask:255.255.255.0
#	   UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
#	   RX packets:1691 errors:0 dropped:0 overruns:0 frame:0
#	   TX packets:1849 errors:0 dropped:0 overruns:0 carrier:0
#	   collisions:4 txqueuelen:100
#	   Interrupt:10 Base address:0x300


$[ = 1;		# Set array base to 1 (para que $p[1] = $1 de awk)
$, = ' ';	# Set output field separator
$\ = ' ';	# Set output record separador
			## $\ = "\n";	# Set output record separador


# LEER ARGUMENTOS (array @ARGV)
##    $IFACES = "@ARGV";
##    if ( $IFACES eq "" ) { exit; }


$IPtext = "addr:";		# Identificador de IP
$MASKtext = "Mask:";		# Identificador de mascara red

$iface = "";			# Inicializar vars


# PROCESAR SALIDA DE IFCONFIG
open(NET, "/sbin/ifconfig |");

while ( <NET> ) {	# Bucle para cada linea ($_ o implicito)
    chomp;		# Evitar \n en el ultimo campo

# GENERAR iface PARA TODAS LAS LINEAS
    if( ! /^[ \t]+/ ) {		# Si la linea no empieza en espacios/tabuladores
	@p = split(' ', $_, 2);
	$iface = $p[1];		# la primera palabra es el nombre del interface
    }

		##    print $iface, $_;

# LOCALIZAR LA LINEA DE IPs
    if( /$IPtext/ ) {

# SI NO SE HA PEDIDO ESTE IFACE SIGUIENTE
	$choosen = "no";
	foreach $n (@ARGV) {
		##	    print "n=" . $n  . " ";	# debug
	    if ( $n eq "all" ) { $choosen = "yes"; }	# all = todos
	    if ( $iface =~ /^$n/ ) { $choosen = "yes"; }
	}
	if ( $choosen eq "no" ) { next; }

# DELIMITAR LA IP
	$ip = $_;
	$ip =~ s/.*$IPtext//;		# Quitar lo de antes
	$ip =~ s/[ \t]+.*//;		# Quitar lo de despues

# DELIMITAR LA MASCARA
	$mask = $_;
	$mask =~ s/.*$MASKtext//;	# Quitar lo de antes
	$mask =~ s/[ \t]+.*//;		# Quitar lo de despues

# CONVERTIR IP EN RED
	@n = split(/\./, $ip, 4);	# ip en un array (para obtener net)
	@m = split(/\./, $mask, 4);	# mask en un array

		##	print $n[1], ".", $n[2], ".", $n[3], ".", $n[4];
	$n[1] = int( $n[1] ) & int( $m[1] );	# Aplico mascara a ip (AND)
	$n[2] = int( $n[2] ) & int( $m[2] );
	$n[3] = int( $n[3] ) & int( $m[3] );
	$n[4] = int( $n[4] ) & int( $m[4] );

# ENVIAR A STDOUT
		##	print $ip . "/" . $mask . " ";
	print $n[1] . "." . $n[2] . "." . $n[3] . "." . $n[4] . "/" . $mask;
    }
}
close(NET);
exit;
