summaryrefslogtreecommitdiffstats
path: root/extra/resolveip.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--extra/resolveip.c219
1 files changed, 219 insertions, 0 deletions
diff --git a/extra/resolveip.c b/extra/resolveip.c
new file mode 100644
index 00000000..890912d9
--- /dev/null
+++ b/extra/resolveip.c
@@ -0,0 +1,219 @@
+/*
+ Copyright (c) 2000, 2010, Oracle and/or its affiliates
+
+ 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
+ the Free Software Foundation; version 2 of the License.
+
+ This program 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 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
+
+/* Resolves IP's to hostname and hostnames to IP's */
+
+#define RESOLVE_VERSION "2.3"
+
+#include <my_global.h>
+#include <m_ctype.h>
+#include <my_sys.h>
+#include <m_string.h>
+#ifndef WIN32
+# include <sys/types.h>
+# include <sys/socket.h>
+# include <netinet/in.h>
+# include <arpa/inet.h>
+# include <netdb.h>
+#endif
+#include <my_net.h>
+#include <my_getopt.h>
+
+#if !defined(_AIX) && !defined(h_errno)
+extern int h_errno;
+#endif
+
+static my_bool silent;
+
+static struct my_option my_long_options[] =
+{
+ {"help", '?', "Displays this help and exits.",
+ 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
+ {"info", 'I', "Synonym for --help.",
+ 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
+ {"silent", 's', "Be more silent.", &silent, &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}
+};
+
+
+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);
+ my_print_help(my_long_options);
+ my_print_variables(my_long_options);
+}
+
+
+static my_bool
+get_one_option(const struct my_option *opt,
+ const char *argument __attribute__((unused)),
+ const char *filename __attribute__((unused)))
+{
+ switch (opt->id) {
+ case 'V': print_version(); exit(0);
+ case 'I':
+ case '?':
+ usage();
+ my_end(0);
+ exit(0);
+ }
+ return 0;
+}
+
+/*static char * load_default_groups[]= { "resolveip","client",0 }; */
+
+static int get_options(int *argc,char ***argv)
+{
+ int ho_error;
+
+ if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option)))
+ {
+ my_end(0);
+ exit(ho_error);
+ }
+
+ if (*argc == 0)
+ {
+ usage();
+ return 1;
+ }
+ return 0;
+} /* get_options */
+
+
+
+int main(int argc, char **argv)
+{
+ struct hostent *hpaddr;
+ in_addr_t taddr;
+ char *ip,**q;
+ int error=0;
+
+ MY_INIT(argv[0]);
+
+ if (get_options(&argc,&argv))
+ {
+ my_end(0);
+ exit(1);
+ }
+
+ while (argc--)
+ {
+ my_bool do_more;
+#ifndef WIN32
+ struct in_addr addr;
+#endif
+ ip = *argv++;
+
+ /* Not compatible with IPv6! Probably should use getnameinfo(). */
+#ifdef WIN32
+ taddr = inet_addr(ip);
+ do_more= (taddr != INADDR_NONE);
+#else
+ if ((do_more= (inet_aton(ip, &addr) != 0)))
+ taddr= addr.s_addr;
+#endif
+ if (do_more)
+ {
+ 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));
+ }
+ }
+ }
+ }
+ my_end(0);
+ exit(error);
+}