#!/usr/bin/perl -w use strict; sub tobin($$) { my($x, $col) = @_; my($s, $i); $s = ""; for ($i = 0; $i < $col; $i++) { $s = (($x & 1) ? "1" : "0") . $s; $x >>= 1; } return $s; } sub s_addr_to_v($) { my($s_addr) = @_; my(@v); $v[0] = ($s_addr >> 24) & 0xff; $v[1] = ($s_addr >> 16) & 0xff; $v[2] = ($s_addr >> 8) & 0xff; $v[3] = $s_addr & 0xff; return @v; } sub s_addr_to_dec($) { my($s_addr) = @_; my(@v) = s_addr_to_v($s_addr); return sprintf("%d.%d.%d.%d", $v[0], $v[1], $v[2], $v[3]); } sub s_addr_to_hex($) { my($s_addr) = @_; my(@v) = s_addr_to_v($s_addr); return sprintf("%02x:%02x:%02x:%02x", $v[0], $v[1], $v[2], $v[3]); } sub s_addr_to_bin($) { my($s_addr) = @_; my(@v) = s_addr_to_v($s_addr); return sprintf("%8s:%8s:%8s:%8s", tobin($v[0], 8), tobin($v[1], 8), tobin($v[2], 8), tobin($v[3], 8)); } # mask length to mask bit pattern sub itomask($) { my($mlen) = @_; my($mask, $i); $mask = 0; for ($i = 0; $i < $mlen; $i++) { $mask = (1 << 31) | ($mask >> 1); } return $mask; } sub inet_addr($) { my($ipstr) = @_; my(@v, $i, $s_addr); @v = split(/\./, $ipstr . ".0.0.0.0"); $s_addr = 0; for ($i = 0; $i < 4; $i++) { $s_addr = ($s_addr * 256) + $v[$i]; } return $s_addr; } sub ipstr_to_mlen($) { my($ipstr) = @_; my(@v, $mlen); @v = split(/\./, $ipstr); if (($v[0] & 0x80) == 0x00) { $mlen = 8; } elsif (($v[0] & 0xc0) == 0x80) { $mlen = 16; } elsif (($v[0] & 0xf0) == 0xc0) { $mlen = 24; } else { $mlen = 0; } return $mlen; } sub do_ip($) { my($ipstr) = @_; my($mlen, $s_addr, $netmask, $network, $broadcast, $j); if ($ipstr =~ /\//) { ($mlen = $ipstr) =~ s/.*\///; $ipstr =~ s/\/.*//; } else { $mlen = ipstr_to_mlen($ipstr); } $s_addr = inet_addr($ipstr); $netmask = itomask($mlen); $broadcast = ($s_addr & $netmask) | ~$netmask; $network = $s_addr & $netmask; printf("inet %-15s ", s_addr_to_dec($s_addr)); printf("%s ", s_addr_to_hex($s_addr)); printf("%s\n", s_addr_to_bin($s_addr)); printf("netmask %-15s ", s_addr_to_dec($netmask)); printf("%s ", s_addr_to_hex($netmask)); printf("%s\n", s_addr_to_bin($netmask)); printf("network %-15s ", s_addr_to_dec($network)); printf("%s ", s_addr_to_hex($network)); printf("%s\n", s_addr_to_bin($network)); printf("broadcast %-15s ", s_addr_to_dec($broadcast)); printf("%s ", s_addr_to_hex($broadcast)); printf("%s\n", s_addr_to_bin($broadcast)); printf("inet %s/%d netmask %s broadcast %s\n", s_addr_to_dec($s_addr), $mlen, s_addr_to_dec($netmask), s_addr_to_dec($broadcast)); return 0; } sub main() { my($i, $ex); $ex = 1; if ($#ARGV == -1) { printf(STDERR "usage: ip ip-addr[/mask]\n"); } else { for ($i = 0; $i < $#ARGV + 1; $i++) { if (do_ip($ARGV[$i]) < 0) { $ex = 1; } } } return $ex; } exit(main());