resolveip.c 4.78 KB
Newer Older
unknown's avatar
unknown committed
1 2 3 4
/* 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
unknown's avatar
unknown committed
5
   the Free Software Foundation; version 2 of the License.
unknown's avatar
unknown committed
6 7

   This program is distributed in the hope that it will be useful,
unknown's avatar
unknown committed
8
   but WITHOUT ANY WARRANTY; without even the implied warranty of
unknown's avatar
unknown committed
9 10 11 12 13 14
   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 */
unknown's avatar
unknown committed
15 16 17

/* Resolves IP's to hostname and hostnames to IP's */

unknown's avatar
unknown committed
18
#define RESOLVE_VERSION "2.3"
unknown's avatar
unknown committed
19

unknown's avatar
unknown committed
20
#include <my_global.h>
unknown's avatar
unknown committed
21 22
#include <m_ctype.h>
#include <my_sys.h>
23
#include <m_string.h>
24 25 26 27 28 29 30 31
#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>
unknown's avatar
unknown committed
32
#endif
unknown's avatar
unknown committed
33
#include <my_net.h>
34
#include <my_getopt.h>
35

unknown's avatar
unknown committed
36 37 38 39
#if !defined(_AIX) && !defined(HAVE_UNIXWARE7_THREADS) && !defined(HAVE_UNIXWARE7_POSIX) && !defined(h_errno)
extern int h_errno;
#endif

40
static my_bool silent;
unknown's avatar
unknown committed
41

42
static struct my_option my_long_options[] =
unknown's avatar
unknown committed
43
{
44 45
  {"help", '?', "Displays this help and exits.",
   0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
46
  {"info", 'I', "Synonym for --help.",
47 48 49 50 51 52
   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}
unknown's avatar
unknown committed
53 54 55 56 57 58 59
};


static void print_version(void)
{
  printf("%s Ver %s, for %s (%s)\n",my_progname,RESOLVE_VERSION,
	 SYSTEM_TYPE,MACHINE_TYPE);
unknown's avatar
unknown committed
60
}
unknown's avatar
unknown committed
61 62 63 64 65 66 67 68


static void usage(void)
{
  print_version();
  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");
  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);
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
  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;
unknown's avatar
unknown committed
86 87 88 89 90 91
}

/*static my_string load_default_groups[]= { "resolveip","client",0 }; */

static int get_options(int *argc,char ***argv)
{
92
  int ho_error;
unknown's avatar
unknown committed
93

94
  if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option)))
95 96
    exit(ho_error);

unknown's avatar
unknown committed
97 98 99 100 101 102 103 104 105 106 107 108 109
  if (*argc == 0)
  {
    usage();
    return 1;
  }
  return 0;
} /* get_options */



int main(int argc, char **argv)
{
  struct hostent *hpaddr;
110
  in_addr_t taddr;
unknown's avatar
unknown committed
111 112 113 114 115 116 117 118 119 120 121 122
  char *ip,**q;
  int error=0;

  MY_INIT(argv[0]);

  if (get_options(&argc,&argv))
    exit(1);

  while (argc--)
  {
    ip = *argv++;    

123
    if (my_isdigit(&my_charset_latin1,ip[0]))
unknown's avatar
unknown committed
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
    {
      taddr = inet_addr(ip);
      if (taddr == htonl(INADDR_BROADCAST))
      {	
	puts("Broadcast");
	continue;
      }
      if (taddr == htonl(INADDR_ANY)) 
      {
	if (!taddr) 
	  puts("Null-IP-Addr");
	else
	  puts("Old-Bcast");
	continue;
      }
unknown's avatar
unknown committed
139

unknown's avatar
unknown committed
140 141 142 143 144 145 146 147
      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);
unknown's avatar
unknown committed
148 149
#ifndef __NETWARE__
	  /* this information is not available on NetWare */
unknown's avatar
unknown committed
150 151
	  for (q = hpaddr->h_aliases; *q != 0; q++)
	    (void) printf(", %s", *q);
unknown's avatar
unknown committed
152
#endif /* __NETWARE__ */
unknown's avatar
unknown committed
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
	  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);
}