I have currently a DNS Reverse lookup script which works however there is a small little issue of the script being able to output the DNS system errors.
The problems goes like this:
- User keys in false/wrong internet address name etc. “www.whyisthednsnothappening.com”
- The script would then clear the screen using system(clear)
- The script would then print “can’t resolve DNS. The error is due to: various System error“
- The script re directs the user back to the same menu/script to type in the name address again.
So the main problem is now step 3 which the script only shows me “Can’t resolve DNS. The error is due to: BLANK ” Which BLANK is suppose to show errors like “Bad arg length for Socket::inet_ntoa, length is 0, should be 4 at ./showdns.pl line 28, <> line 1.” and the menu of the DNS script is located below of the error print.
The Codes:
#!/usr/bin/perl
use IO::Socket;
use warnings;
use strict;
use Term::ANSIColor;
use Socket;
use Sys::Hostname;
print "\nYou are now in Show DNS IP Address!\n\n";
print "*************\n";
print "|DNS Address|\n";
print "*************\n";
print "\nPlease enter a hostname that you wish to view\n\n";
print "\n\nEnter the hostname of Choice Here: ";
my $userchoice = <>;
chomp ($userchoice);
my $hostname = $userchoice;
my $i_addr = scalar(gethostbyname($hostname || 'localhost'));
if ( ! defined $i_addr ) {
my $err = $!;
my $herr = int herror(const char *s);
system('clear');
print("Can't resolve $hostname: $herr, try again");
exec("/root/Desktop/showdns.pl");
exit();
}
my $name = inet_ntoa($i_addr);
my $coloredText = colored($name, 'bold underline blue');
print "\n\nThe hostname IP address is: $coloredText\n\n";
print "Press enter to go back to the main menu\n\n";
my $userinput2 = <>;
chomp ($userinput2);
system("clear");
system("/root/Desktop/simpleip.pl");
Can someone please give advice on the codes? Thanks!
Ah, I see what you mean. The system(“clear”) call is clearing the $! variable before you have a chance to print the error from gethostbyname.
Though as far as I can tell, the particular error gethostbyname returns isn’t very meaningful.
You may want to look into putting a loop in your script instead of having it start over using system(). You certainly don’t want to continue on to inet_ntoa if there was a failure. Note that inet_ntoa doesn’t have anything to do with a DNS lookup; that’s done by gethostbyname. inet_ntoa just changes a 4-byte string into the normal 123.123.123.123
printable form of an ipaddress.
sprintf("%vd", $i_addr)does the same thing.