diff options
Diffstat (limited to 'contrib/syslinux-4.02/utils/gethostip.c')
-rw-r--r-- | contrib/syslinux-4.02/utils/gethostip.c | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/contrib/syslinux-4.02/utils/gethostip.c b/contrib/syslinux-4.02/utils/gethostip.c new file mode 100644 index 0000000..f3f8757 --- /dev/null +++ b/contrib/syslinux-4.02/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; +} |