summaryrefslogtreecommitdiff
path: root/extra/resolveip.c
diff options
context:
space:
mode:
Diffstat (limited to 'extra/resolveip.c')
-rw-r--r--extra/resolveip.c204
1 files changed, 204 insertions, 0 deletions
diff --git a/extra/resolveip.c b/extra/resolveip.c
new file mode 100644
index 00000000000..d739f8de244
--- /dev/null
+++ b/extra/resolveip.c
@@ -0,0 +1,204 @@
+/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ MA 02111-1307, USA */
+
+/* Resolves IP's to hostname and hostnames to IP's */
+
+#define RESOLVE_VERSION "2.0"
+
+#include <global.h>
+#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>
+#include <m_ctype.h>
+#include <my_sys.h>
+#include <getopt.h>
+
+#if !defined(_AIX) && !defined(HAVE_UNIXWARE7_THREADS) && !defined(HAVE_UNIXWARE7_POSIX) && !defined(h_errno)
+extern int h_errno;
+#endif
+
+static int silent=0;
+
+static struct option long_options[] =
+{
+ {"help", no_argument, 0, '?'},
+ {"info", no_argument, 0, 'I'},
+ {"silent", no_argument, 0, 's'},
+ {"version", no_argument, 0, 'V'},
+ {0, 0, 0, 0}
+};
+
+
+static void print_version(void)
+{
+ printf("%s Ver %s, for %s (%s)\n",my_progname,RESOLVE_VERSION,
+ SYSTEM_TYPE,MACHINE_TYPE);
+}
+
+
+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);
+ printf("\n\
+ -?, --help Displays this help and exits.\n\
+ -I, --info Synonym for the above.\n\
+ -s, --silent Be more silent.\n\
+ -V, --version Displays version information and exits.\n");
+}
+
+/*static my_string load_default_groups[]= { "resolveip","client",0 }; */
+
+static int get_options(int *argc,char ***argv)
+{
+ int c,option_index;
+
+ /* load_defaults("my",load_default_groups,argc,argv); */
+ while ((c=getopt_long(*argc,*argv,"?IsV",
+ long_options, &option_index)) != EOF)
+ {
+ switch (c) {
+ case 's':
+ silent=1;
+ break;
+ case 'V': print_version(); exit(0);
+ case 'I':
+ case '?':
+ usage();
+ exit(0);
+ default:
+ fprintf(stderr,"%s: Illegal option character '%c'\n",
+ my_progname,opterr);
+ return(1);
+ break;
+ }
+ }
+ (*argc)-=optind;
+ (*argv)+=optind;
+ if (*argc == 0)
+ {
+ usage();
+ return 1;
+ }
+ return 0;
+} /* get_options */
+
+
+
+int main(int argc, char **argv)
+{
+ struct hostent *hpaddr;
+ u_long taddr;
+ char *ip,**q;
+ int error=0;
+
+ MY_INIT(argv[0]);
+
+ if (get_options(&argc,&argv))
+ exit(1);
+
+ while (argc--)
+ {
+ ip = *argv++;
+
+ if (isdigit(ip[0]))
+ {
+ 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;
+ }
+
+ 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);
+ for (q = hpaddr->h_aliases; *q != 0; q++)
+ (void) printf(", %s", *q);
+ 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);
+}
+
+
+