#include <stdlib.h>
#include <stdio.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <errno.h>
/* Defind INADDR_NONE for systems(solaris) that don't fully support sockets. */
#ifndef INADDR_NONE
#define INADDR_NONE -1
#endif /* INADDR_NONE */
/* We pull a bit of data out of argv here. argv[1] is the flag, either -i
* or -h depending on whether we're outputting an ip or a hostname. */
int
main (int argc, char **argv)
{
if (argc != 3) {
printf ("Not the right number of arguments to the resolver\n");
return EXIT_FAILURE;
}
if (0 == strcmp (argv[1], "-i")) {
struct hostent *host;
struct in_addr addr;
host = gethostbyname (argv[2]);
if (NULL == host) {
printf ("ERROR: system errno is %i, '%s'\n",
errno, strerror(errno));
return EXIT_FAILURE;
}
memcpy ((void*)&addr, host->h_addr, host->h_length);
printf ("%s\n", inet_ntoa(addr));
return EXIT_SUCCESS;
} else if (0 == strcmp (argv[1], "-h")) {
struct hostent *host;
unsigned long address_as_int;
/* INADDR_NONE is failure from inet_addr(). */
address_as_int = inet_addr (argv[2]);
if (INADDR_NONE == address_as_int) {
printf ("ERROR: invalid ip address\n");
return EXIT_FAILURE;
}
host = gethostbyaddr ((char *)&address_as_int,
sizeof (address_as_int), AF_INET);
if (NULL == host) {
printf ("ERROR: system errno is %i, '%s'\n",
errno, strerror(errno));
return EXIT_FAILURE;
}
printf ("%s\n", host->h_name);
return EXIT_SUCCESS;
}
printf ("'%s' wasn't -i or -h\n", argv[1]);
return EXIT_FAILURE;
}
syntax highlighted by Code2HTML, v. 0.9.1