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
usage(int exit_code)41 void usage(int exit_code)
42 {
43 fprintf(stderr, "Usage: %s [-dxnf] hostname/ip...\n", program);
44 exit(exit_code);
45 }
46
main(int argc,char * argv[])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