/*****************************************************************************/
/* Simple Resolving Program						     */
/*                                                                           */
/* The client get the following input:                                       */
/*   * Name of the entity we want to get details about                       */
/*                                                                           */
/*                                                                           */
/*                                                                           */
/*                                                                           */
/* Process:                                                                  */
/*   The program issues resolving procedure (gethostbyname) and the          */
/*       addresses returned are printed on the screen.                       */
/*                                                                           */
/*                                                                           */
/*                                                                           */
/*                                                                           */
/*                                                                           */
/* The source is taken from Beej's Guide to Network Programming              */
/*                                                                           */
/*                                                                           */
/*                                                                           */
/*****************************************************************************/

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <errno.h> 
    #include <string.h> 
    #include <netdb.h> 
    #include <sys/types.h> 
    #include <netinet/in.h> 
    #include <sys/socket.h>
    #include <sys/utsname.h>


int
main(int argc, char **argv)
{
        char   *ptr, **pptr;
        char   str[INET_ADDRSTRLEN];
        struct hostent  *hptr;
 
        while (--argc > 0) {
                ptr = *++argv;
                if ( (hptr = gethostbyname(ptr)) == NULL) {
                        printf("gethostbyname error for host: %s: %s", ptr, hstrerror(h_errno));
                        continue;
                }
                printf("official hostname: %s\n", hptr->h_name);
 
                for (pptr = hptr->h_aliases; *pptr != NULL; pptr++)
                        printf("        alias: %s\n", *pptr);
 
                switch (hptr->h_addrtype) {
		case AF_INET: 
                        pptr = hptr->h_addr_list;
                        for ( ; *pptr != NULL; pptr++) {
                                printf("\taddress: %s\n",
                                        inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str)));
 
                                if ( (hptr = gethostbyaddr(*pptr, hptr->h_length,
                                             hptr->h_addrtype)) == NULL)
                                        printf("\t(gethostbyaddr failed)\n");
                                else if (hptr->h_name != NULL)
                                        printf("\tname = %s\n", hptr->h_name);
                                else
                                        printf("\t(no hostname returned by gethostbyaddr)\n");
                        }
                        break;
 
                default:
                        perror("unknown address type");
                        break;
                }
        }
        exit(0);
}