home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 January / Chip_2001-01_cd1.bin / tema / mysql / mysql-3.23.28g-win-source.exe / extra / resolveip.c < prev   
C/C++ Source or Header  |  2000-08-31  |  5KB  |  205 lines

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This library is free software; you can redistribute it and/or
  4.    modify it under the terms of the GNU Library General Public
  5.    License as published by the Free Software Foundation; either
  6.    version 2 of the License, or (at your option) any later version.
  7.    
  8.    This library is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.    Library General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU Library General Public
  14.    License along with this library; if not, write to the Free
  15.    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  16.    MA 02111-1307, USA */
  17.  
  18. /* Resolves IP's to hostname and hostnames to IP's */
  19.  
  20. #define RESOLVE_VERSION "2.0"
  21.  
  22. #include <global.h>
  23. #include <sys/types.h>
  24. #include <sys/socket.h>
  25. #ifndef HAVE_BROKEN_NETINET_INCLUDES
  26. #include <netinet/in.h>
  27. #endif
  28. #include <arpa/inet.h>
  29. #include <netdb.h>
  30. #include <m_ctype.h>
  31. #include <my_sys.h>
  32. #include <getopt.h>
  33.  
  34. #if !defined(_AIX) && !defined(HAVE_UNIXWARE7_THREADS) && !defined(HAVE_UNIXWARE7_POSIX) && !defined(h_errno)
  35. extern int h_errno;
  36. #endif
  37.  
  38. static int silent=0;
  39.  
  40. static struct option long_options[] =
  41. {
  42.   {"help",       no_argument,        0, '?'},
  43.   {"info",       no_argument,        0, 'I'},
  44.   {"silent",     no_argument,        0, 's'},
  45.   {"version",    no_argument,        0, 'V'},
  46.   {0, 0, 0, 0}
  47. };
  48.  
  49.  
  50. static void print_version(void)
  51. {
  52.   printf("%s Ver %s, for %s (%s)\n",my_progname,RESOLVE_VERSION,
  53.      SYSTEM_TYPE,MACHINE_TYPE);
  54. }     
  55.  
  56.  
  57. static void usage(void)
  58. {
  59.   print_version();
  60.   puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license\n");
  61.   puts("Get hostname based on IP-address or IP-address based on hostname.\n");
  62.   printf("Usage: %s [OPTIONS] hostname or IP-address\n",my_progname);
  63.   printf("\n\
  64.   -?, --help     Displays this help and exits.\n\
  65.   -I, --info     Synonym for the above.\n\
  66.   -s, --silent   Be more silent.\n\
  67.   -V, --version  Displays version information and exits.\n");
  68. }
  69.  
  70. /*static my_string load_default_groups[]= { "resolveip","client",0 }; */
  71.  
  72. static int get_options(int *argc,char ***argv)
  73. {
  74.   int c,option_index;
  75.  
  76.   /*  load_defaults("my",load_default_groups,argc,argv); */
  77.   while ((c=getopt_long(*argc,*argv,"?IsV",
  78.             long_options, &option_index)) != EOF)
  79.   {
  80.     switch (c) {
  81.     case 's':
  82.       silent=1;
  83.       break;
  84.     case 'V': print_version(); exit(0);
  85.     case 'I':
  86.     case '?':
  87.       usage();
  88.       exit(0);
  89.     default:
  90.       fprintf(stderr,"%s: Illegal option character '%c'\n",
  91.           my_progname,opterr);
  92.       return(1);
  93.       break;
  94.     }
  95.   }
  96.   (*argc)-=optind;
  97.   (*argv)+=optind;
  98.   if (*argc == 0)
  99.   {
  100.     usage();
  101.     return 1;
  102.   }
  103.   return 0;
  104. } /* get_options */
  105.  
  106.  
  107.  
  108. int main(int argc, char **argv)
  109. {
  110.   struct hostent *hpaddr;
  111.   u_long taddr;
  112.   char *ip,**q;
  113.   int error=0;
  114.  
  115.   MY_INIT(argv[0]);
  116.  
  117.   if (get_options(&argc,&argv))
  118.     exit(1);
  119.  
  120.   while (argc--)
  121.   {
  122.     ip = *argv++;    
  123.  
  124.     if (isdigit(ip[0]))
  125.     {
  126.       taddr = inet_addr(ip);
  127.       if (taddr == htonl(INADDR_BROADCAST))
  128.       {    
  129.     puts("Broadcast");
  130.     continue;
  131.       }
  132.       if (taddr == htonl(INADDR_ANY)) 
  133.       {
  134.     if (!taddr) 
  135.       puts("Null-IP-Addr");
  136.     else
  137.       puts("Old-Bcast");
  138.     continue;
  139.       }
  140.       
  141.       hpaddr = gethostbyaddr((char*) &(taddr), sizeof(struct in_addr),AF_INET);
  142.       if (hpaddr) 
  143.       {
  144.     if (silent)
  145.       puts(hpaddr->h_name);
  146.     else
  147.     {
  148.       printf ("Host name of %s is %s", ip,hpaddr->h_name);
  149.       for (q = hpaddr->h_aliases; *q != 0; q++)
  150.         (void) printf(", %s", *q);
  151.       puts("");
  152.     }
  153.       }
  154.       else
  155.       {
  156.     error=2;
  157.     fprintf(stderr,"%s: Unable to find hostname for '%s'\n",my_progname,
  158.         ip);
  159.       }
  160.     }
  161.     else
  162.     {
  163.       hpaddr = gethostbyname(ip);
  164.       if (!hpaddr)
  165.       {
  166.     const char *err;
  167.     fprintf(stderr,"%s: Unable to find hostid for '%s'",my_progname,ip);
  168.     switch (h_errno) {
  169.     case HOST_NOT_FOUND: err="host not found"; break;
  170.     case TRY_AGAIN: err="try again"; break;
  171.     case NO_RECOVERY: err="no recovery"; break;
  172.     case NO_DATA: err="no_data"; break;
  173.     default: err=0;
  174.     }
  175.     if (err)
  176.       fprintf(stderr,": %s\n",err);
  177.     else
  178.       fprintf(stderr,"\n");
  179.     error=2;
  180.       }
  181.       else if (silent)
  182.       {
  183.     struct in_addr in;
  184.     memcpy((char*) &in.s_addr, (char*) *hpaddr->h_addr_list,
  185.            sizeof (in.s_addr));
  186.     puts(inet_ntoa(in));
  187.       }
  188.       else
  189.       {
  190.     char **p;
  191.     for (p = hpaddr->h_addr_list; *p != 0; p++)
  192.     {
  193.       struct in_addr in;
  194.       memcpy(&in.s_addr, *p, sizeof (in.s_addr));
  195.       printf ("IP address of %s is %s\n",ip,inet_ntoa(in));
  196.     }
  197.       }
  198.     }
  199.   }
  200.   exit(error);
  201. }
  202.  
  203.  
  204.  
  205.