aboutsummaryrefslogtreecommitdiffstats
path: root/utils/gethostip.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/gethostip.c')
-rw-r--r--utils/gethostip.c131
1 files changed, 131 insertions, 0 deletions
diff --git a/utils/gethostip.c b/utils/gethostip.c
new file mode 100644
index 00000000..2a1e6e65
--- /dev/null
+++ b/utils/gethostip.c
@@ -0,0 +1,131 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 2001-2008 H. Peter Anvin - All Rights Reserved
+ *
+ * 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, Inc., 53 Temple Place Ste 330,
+ * Boston MA 02111-1307, USA; either version 2 of the License, or
+ * (at your option) any later version; incorporated herein by reference.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * gethostip.c
+ *
+ * Small program to use gethostbyname() to print out a hostname in
+ * hex and/or dotted-quad notation
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <netdb.h>
+#include <sys/socket.h>
+#include <unistd.h>
+#include <sysexits.h>
+#define _GNU_SOURCE /* For getopt_long */
+#include <getopt.h>
+
+const struct option options[] =
+{
+ { "hexadecimal", 0, NULL, 'x' },
+ { "decimal", 0, NULL, 'd' },
+ { "dotted-quad", 0, NULL, 'd' },
+ { "full-output", 0, NULL, 'f' },
+ { "name", 0, NULL, 'n' },
+ { "help", 0, NULL, 'h' },
+ { NULL, 0, NULL, 0 }
+};
+
+const char *program;
+
+void usage(int exit_code)
+{
+ fprintf(stderr, "Usage: %s [-dxnf] hostname/ip...\n", program);
+ exit(exit_code);
+}
+
+int main(int argc, char *argv[])
+{
+ int opt;
+ int output = 0;
+ int i;
+ char *sep;
+ int err = 0;
+
+ struct hostent *host;
+
+ program = argv[0];
+
+ while ( (opt = getopt_long(argc, argv, "dxfnh", options, NULL)) != -1 ) {
+ switch ( opt ) {
+ case 'd':
+ output |= 2; /* Decimal output */
+ break;
+ case 'x':
+ output |= 4; /* Hexadecimal output */
+ break;
+ case 'n':
+ output |= 1; /* Canonical name output */
+ break;
+ case 'f':
+ output = 7; /* Full output */
+ break;
+ case 'h':
+ usage(0);
+ break;
+ default:
+ usage(EX_USAGE);
+ break;
+ }
+ }
+
+ if ( optind == argc )
+ usage(EX_USAGE);
+
+ if ( output == 0 )
+ output = 7; /* Default output */
+
+ for ( i = optind ; i < argc ; i++ ) {
+ sep = "";
+ host = gethostbyname(argv[i]);
+ if ( !host ) {
+ herror(argv[i]);
+ err = 1;
+ continue;
+ }
+
+ if ( host->h_addrtype != AF_INET || host->h_length != 4 ) {
+ fprintf(stderr, "%s: No IPv4 address associated with name\n", argv[i]);
+ err = 1;
+ continue;
+ }
+
+ if ( output & 1 ) {
+ printf("%s%s", sep, host->h_name);
+ sep = " ";
+ }
+
+ if ( output & 2 ) {
+ printf("%s%u.%u.%u.%u", sep,
+ ((unsigned char *)host->h_addr)[0],
+ ((unsigned char *)host->h_addr)[1],
+ ((unsigned char *)host->h_addr)[2],
+ ((unsigned char *)host->h_addr)[3]);
+ sep = " ";
+ }
+
+ if ( output & 4 ) {
+ printf("%s%02X%02X%02X%02X", sep,
+ ((unsigned char *)host->h_addr)[0],
+ ((unsigned char *)host->h_addr)[1],
+ ((unsigned char *)host->h_addr)[2],
+ ((unsigned char *)host->h_addr)[3]);
+ sep = " ";
+ }
+
+ putchar('\n');
+ }
+
+ return err;
+}