/* findip.c
   find official name, aliases and ip addresses for a given host
   name or ip address.
   Compiles on linux & solaris (-lnsl -lresolv) */

#include<netdb.h>
#include<sys/socket.h>
#include<stdio.h>
#include<netinet/in.h>
//#include<arpa/inet.h>

extern int h_errno;	//for reporting errors on dns lookups

main(int argc,char *argv[])
{
   struct hostent *host;
   struct in_addr dir_inet;
   int i;
   
   if(argc<2)
     {
	fprintf(stderr,"No host specified\n");
	exit(1);
     }
   
   if(inet_aton(argv[1],&dir_inet)) /*test if argv[1] is an ip address or a
				      * DNS name */

     {
	if((host=gethostbyaddr((char *)&dir_inet.s_addr,4,AF_INET))==NULL)
	  {
	     herror(argv[1]); /* we use gethostbyname to get DNS name too */
	     exit(2);
	  }
     }
   else		/* argv[1] is a dns name */
     {
        if((host=gethostbyname(argv[1]))==NULL)
          {
	     herror(argv[1]);
	     exit(3);
          }
     }

  /* Official name */
   printf("Official name:\n  -%s\n",host->h_name);
   
   /* Aliases */
   i=0;
   printf("Aliases:\n");
   if(host->h_aliases[0]==NULL)
     printf("  NONE\n");
   else
     while(host->h_aliases[i]!=NULL)
       printf("  -%s\n",host->h_aliases[i++]);
   
   /* ip addresses */
   i=0;
   printf("Addresses:\n");
   if(host->h_addr_list[0]==0)
     printf("  NONE\n");
   else
     while(host->h_addr_list[i]!=0) {
       memcpy(&dir_inet.s_addr,host->h_addr_list[i++],sizeof(dir_inet.s_addr));
       printf("  -%s\n",inet_ntoa(dir_inet));
     }
}
   
