2001-12-06 13:10:51 +01:00
/* Copyright (C) 2000 MySQL AB
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
2006-12-23 20:17:15 +01:00
the Free Software Foundation ; version 2 of the License .
2001-12-06 13:10:51 +01:00
This program is distributed in the hope that it will be useful ,
2000-07-31 21:29:14 +02:00
but WITHOUT ANY WARRANTY ; without even the implied warranty of
2001-12-06 13:10:51 +01:00
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program ; if not , write to the Free Software
Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA */
2000-07-31 21:29:14 +02:00
/* Resolves IP's to hostname and hostnames to IP's */
2003-01-28 07:38:28 +01:00
# define RESOLVE_VERSION "2.3"
2001-12-06 13:10:51 +01:00
2001-09-14 01:54:33 +02:00
# include <my_global.h>
2000-07-31 21:29:14 +02:00
# include <m_ctype.h>
# include <my_sys.h>
2001-08-25 18:18:20 +02:00
# include <m_string.h>
2007-12-28 01:02:28 +01:00
# ifndef WIN32
# include <sys / types.h>
# include <sys / socket.h>
# ifndef HAVE_BROKEN_NETINET_INCLUDES
# include <netinet / in.h>
# endif
# include <arpa / inet.h>
# include <netdb.h>
2000-07-31 21:29:14 +02:00
# endif
2002-05-31 14:22:38 +02:00
# include <my_net.h>
2002-05-22 22:54:24 +02:00
# include <my_getopt.h>
2001-12-14 15:02:41 +01:00
2000-07-31 21:29:14 +02:00
# if !defined(_AIX) && !defined(HAVE_UNIXWARE7_THREADS) && !defined(HAVE_UNIXWARE7_POSIX) && !defined(h_errno)
extern int h_errno ;
# endif
2002-05-22 22:54:24 +02:00
static my_bool silent ;
2000-07-31 21:29:14 +02:00
2002-05-22 22:54:24 +02:00
static struct my_option my_long_options [ ] =
2000-07-31 21:29:14 +02:00
{
2002-05-22 22:54:24 +02:00
{ " help " , ' ? ' , " Displays this help and exits. " ,
0 , 0 , 0 , GET_NO_ARG , NO_ARG , 0 , 0 , 0 , 0 , 0 , 0 } ,
2003-06-13 10:59:02 +02:00
{ " info " , ' I ' , " Synonym for --help. " ,
2002-05-22 22:54:24 +02:00
0 , 0 , 0 , GET_NO_ARG , NO_ARG , 0 , 0 , 0 , 0 , 0 , 0 } ,
{ " silent " , ' s ' , " Be more silent. " , ( gptr * ) & silent , ( gptr * ) & silent ,
0 , GET_BOOL , NO_ARG , 0 , 0 , 0 , 0 , 0 , 0 } ,
{ " version " , ' V ' , " Displays version information and exits. " ,
0 , 0 , 0 , GET_NO_ARG , NO_ARG , 0 , 0 , 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 , 0 , 0 , GET_NO_ARG , NO_ARG , 0 , 0 , 0 , 0 , 0 , 0 }
2000-07-31 21:29:14 +02:00
} ;
static void print_version ( void )
{
printf ( " %s Ver %s, for %s (%s) \n " , my_progname , RESOLVE_VERSION ,
SYSTEM_TYPE , MACHINE_TYPE ) ;
2001-12-06 13:10:51 +01:00
}
2000-07-31 21:29:14 +02:00
static void usage ( void )
{
print_version ( ) ;
puts ( " This software comes with ABSOLUTELY NO WARRANTY. This is free software, \n and you are welcome to modify and redistribute it under the GPL license \n " ) ;
puts ( " Get hostname based on IP-address or IP-address based on hostname. \n " ) ;
printf ( " Usage: %s [OPTIONS] hostname or IP-address \n " , my_progname ) ;
2002-05-22 22:54:24 +02:00
my_print_help ( my_long_options ) ;
my_print_variables ( my_long_options ) ;
}
static my_bool
get_one_option ( int optid , const struct my_option * opt __attribute__ ( ( unused ) ) ,
char * argument __attribute__ ( ( unused ) ) )
{
switch ( optid ) {
case ' V ' : print_version ( ) ; exit ( 0 ) ;
case ' I ' :
case ' ? ' :
usage ( ) ;
exit ( 0 ) ;
}
return 0 ;
2000-07-31 21:29:14 +02:00
}
/*static my_string load_default_groups[]= { "resolveip","client",0 }; */
static int get_options ( int * argc , char * * * argv )
{
2002-05-22 22:54:24 +02:00
int ho_error ;
2000-07-31 21:29:14 +02:00
2002-05-22 22:54:24 +02:00
if ( ( ho_error = handle_options ( argc , argv , my_long_options , get_one_option ) ) )
2002-05-29 14:07:30 +02:00
exit ( ho_error ) ;
2000-07-31 21:29:14 +02:00
if ( * argc = = 0 )
{
usage ( ) ;
return 1 ;
}
return 0 ;
} /* get_options */
int main ( int argc , char * * argv )
{
struct hostent * hpaddr ;
2003-08-18 20:01:38 +02:00
in_addr_t taddr ;
2000-07-31 21:29:14 +02:00
char * ip , * * q ;
int error = 0 ;
MY_INIT ( argv [ 0 ] ) ;
if ( get_options ( & argc , & argv ) )
exit ( 1 ) ;
while ( argc - - )
{
2008-02-11 18:02:37 +01:00
# ifndef WIN32
2008-01-23 17:34:08 +01:00
struct in_addr addr ;
2008-02-11 18:02:37 +01:00
# endif
2000-07-31 21:29:14 +02:00
ip = * argv + + ;
2008-01-23 17:34:08 +01:00
/* Not compatible with IPv6! Probably should use getnameinfo(). */
2008-02-11 18:02:37 +01:00
# ifdef WIN32
taddr = inet_addr ( ip ) ;
if ( taddr ! = INADDR_NONE )
{
# else
2008-01-23 17:34:08 +01:00
if ( inet_aton ( ip , & addr ) ! = 0 )
2000-07-31 21:29:14 +02:00
{
2008-01-23 17:34:08 +01:00
taddr = addr . s_addr ;
2008-02-11 18:02:37 +01:00
# endif
2000-07-31 21:29:14 +02:00
if ( taddr = = htonl ( INADDR_BROADCAST ) )
{
puts ( " Broadcast " ) ;
continue ;
}
if ( taddr = = htonl ( INADDR_ANY ) )
{
if ( ! taddr )
puts ( " Null-IP-Addr " ) ;
else
puts ( " Old-Bcast " ) ;
continue ;
}
2001-12-06 13:10:51 +01:00
2000-07-31 21:29:14 +02:00
hpaddr = gethostbyaddr ( ( char * ) & ( taddr ) , sizeof ( struct in_addr ) , AF_INET ) ;
if ( hpaddr )
{
if ( silent )
puts ( hpaddr - > h_name ) ;
else
{
printf ( " Host name of %s is %s " , ip , hpaddr - > h_name ) ;
2003-01-28 07:38:28 +01:00
# ifndef __NETWARE__
/* this information is not available on NetWare */
2000-07-31 21:29:14 +02:00
for ( q = hpaddr - > h_aliases ; * q ! = 0 ; q + + )
( void ) printf ( " , %s " , * q ) ;
2003-01-28 07:38:28 +01:00
# endif /* __NETWARE__ */
2000-07-31 21:29:14 +02:00
puts ( " " ) ;
}
}
else
{
error = 2 ;
fprintf ( stderr , " %s: Unable to find hostname for '%s' \n " , my_progname ,
ip ) ;
}
}
else
{
hpaddr = gethostbyname ( ip ) ;
if ( ! hpaddr )
{
const char * err ;
fprintf ( stderr , " %s: Unable to find hostid for '%s' " , my_progname , ip ) ;
switch ( h_errno ) {
case HOST_NOT_FOUND : err = " host not found " ; break ;
case TRY_AGAIN : err = " try again " ; break ;
case NO_RECOVERY : err = " no recovery " ; break ;
case NO_DATA : err = " no_data " ; break ;
default : err = 0 ;
}
if ( err )
fprintf ( stderr , " : %s \n " , err ) ;
else
fprintf ( stderr , " \n " ) ;
error = 2 ;
}
else if ( silent )
{
struct in_addr in ;
memcpy ( ( char * ) & in . s_addr , ( char * ) * hpaddr - > h_addr_list ,
sizeof ( in . s_addr ) ) ;
puts ( inet_ntoa ( in ) ) ;
}
else
{
char * * p ;
for ( p = hpaddr - > h_addr_list ; * p ! = 0 ; p + + )
{
struct in_addr in ;
memcpy ( & in . s_addr , * p , sizeof ( in . s_addr ) ) ;
printf ( " IP address of %s is %s \n " , ip , inet_ntoa ( in ) ) ;
}
}
}
}
exit ( error ) ;
}