#!/usr/bin/env perl # # ipname2num- translate DNS names in the input to IP addresses # # $Id$ # when a lookup fails, returns the original text # caches all results use warnings; use strict; use Socket qw( :addrinfo sockaddr_family inet_pton ); my %ipname2num; $| = 1; # force output line flushing my $dnsname_rx = qr/((?!\.)[^\w_-]+)/; # require at least one a . and allow upper case sub ipname2num { my ($name) = @_; my ( $err, @addrs ) = getaddrinfo( $name, 0 ); if ( $err || !@addrs ) { warn "cannot resolve $name: $err\n"; $name; } else { #warn "we found: ", join(', ', @addrs), "\n"; my ( $err, $host ) = getnameinfo( $addrs[0]->{addr}, Socket::NI_NUMERICHOST ); !$err ? $host : $_; } } while (<>) { #my @line = map { split( $dnsname_rx, $_) } split; my @line = split( $dnsname_rx, $_ ); #warn "line: ", join(' + ', @line); @line = map { if ( defined $ipname2num{$_} ) { # looked up before $ipname2num{$_}; } elsif (/\./) { $ipname2num{$_} = ipname2num($_); } else { $_; } } @line; print join( '', @line ); }