Home | History | Annotate | Download | only in utils
      1 /* ----------------------------------------------------------------------- *
      2  *
      3  *   Copyright 2001-2008 H. Peter Anvin - All Rights Reserved
      4  *
      5  *   This program is free software; you can redistribute it and/or modify
      6  *   it under the terms of the GNU General Public License as published by
      7  *   the Free Software Foundation, Inc., 53 Temple Place Ste 330,
      8  *   Boston MA 02111-1307, USA; either version 2 of the License, or
      9  *   (at your option) any later version; incorporated herein by reference.
     10  *
     11  * ----------------------------------------------------------------------- */
     12 
     13 /*
     14  * gethostip.c
     15  *
     16  * Small program to use gethostbyname() to print out a hostname in
     17  * hex and/or dotted-quad notation
     18  */
     19 
     20 #include <stdio.h>
     21 #include <stdlib.h>
     22 #include <netdb.h>
     23 #include <sys/socket.h>
     24 #include <unistd.h>
     25 #include <sysexits.h>
     26 #define _GNU_SOURCE		/* For getopt_long */
     27 #include <getopt.h>
     28 
     29 const struct option options[] = {
     30     {"hexadecimal", 0, NULL, 'x'},
     31     {"decimal", 0, NULL, 'd'},
     32     {"dotted-quad", 0, NULL, 'd'},
     33     {"full-output", 0, NULL, 'f'},
     34     {"name", 0, NULL, 'n'},
     35     {"help", 0, NULL, 'h'},
     36     {NULL, 0, NULL, 0}
     37 };
     38 
     39 const char *program;
     40 
     41 void usage(int exit_code)
     42 {
     43     fprintf(stderr, "Usage: %s [-dxnf] hostname/ip...\n", program);
     44     exit(exit_code);
     45 }
     46 
     47 int main(int argc, char *argv[])
     48 {
     49     int opt;
     50     int output = 0;
     51     int i;
     52     char *sep;
     53     int err = 0;
     54 
     55     struct hostent *host;
     56 
     57     program = argv[0];
     58 
     59     while ((opt = getopt_long(argc, argv, "dxfnh", options, NULL)) != -1) {
     60 	switch (opt) {
     61 	case 'd':
     62 	    output |= 2;	/* Decimal output */
     63 	    break;
     64 	case 'x':
     65 	    output |= 4;	/* Hexadecimal output */
     66 	    break;
     67 	case 'n':
     68 	    output |= 1;	/* Canonical name output */
     69 	    break;
     70 	case 'f':
     71 	    output = 7;		/* Full output */
     72 	    break;
     73 	case 'h':
     74 	    usage(0);
     75 	    break;
     76 	default:
     77 	    usage(EX_USAGE);
     78 	    break;
     79 	}
     80     }
     81 
     82     if (optind == argc)
     83 	usage(EX_USAGE);
     84 
     85     if (output == 0)
     86 	output = 7;		/* Default output */
     87 
     88     for (i = optind; i < argc; i++) {
     89 	sep = "";
     90 	host = gethostbyname(argv[i]);
     91 	if (!host) {
     92 	    herror(argv[i]);
     93 	    err = 1;
     94 	    continue;
     95 	}
     96 
     97 	if (host->h_addrtype != AF_INET || host->h_length != 4) {
     98 	    fprintf(stderr, "%s: No IPv4 address associated with name\n",
     99 		    argv[i]);
    100 	    err = 1;
    101 	    continue;
    102 	}
    103 
    104 	if (output & 1) {
    105 	    printf("%s%s", sep, host->h_name);
    106 	    sep = " ";
    107 	}
    108 
    109 	if (output & 2) {
    110 	    printf("%s%u.%u.%u.%u", sep,
    111 		   ((unsigned char *)host->h_addr)[0],
    112 		   ((unsigned char *)host->h_addr)[1],
    113 		   ((unsigned char *)host->h_addr)[2],
    114 		   ((unsigned char *)host->h_addr)[3]);
    115 	    sep = " ";
    116 	}
    117 
    118 	if (output & 4) {
    119 	    printf("%s%02X%02X%02X%02X", sep,
    120 		   ((unsigned char *)host->h_addr)[0],
    121 		   ((unsigned char *)host->h_addr)[1],
    122 		   ((unsigned char *)host->h_addr)[2],
    123 		   ((unsigned char *)host->h_addr)[3]);
    124 	    sep = " ";
    125 	}
    126 
    127 	putchar('\n');
    128     }
    129 
    130     return err;
    131 }
    132