/* ----------------------------------------------------------------------- * * * 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 #include #include #include #include #include #define _GNU_SOURCE /* For getopt_long */ #include 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; }