/* Compilar usando gcc <...> -lnsl -lxnet*/
/* Programa para resolver hosts */
/* Programa que demuestra el uso de las funciones
 * gethostname, gethostbyname, gethostbyaddr
 * Por : 
 * Oscar Medina Duarte www.medina-web.com
 */


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


main (int argc, char **argv) 
{
char localh[256], lenthted[256];
ulong_t addr;
int locallen;
struct hostent *OurHost;
localh[0] = '\0';
	
	if (argc == 1) { 
		// Si no hay parametros.
		if (gethostname (localh, 256) == -1){
				printf ("ERROR\n");
				exit (1);
		}else {		
			OurHost = gethostbyname (localh);
			if (OurHost != NULL){
				printf("Nombre    >\t%s\n", OurHost->h_name);
				printf("Addr      >\t%i\n", OurHost->h_addr_list[0]);
				printf("IP Addr   >\t%s\n", inet_ntoa( *(struct in_addr *) OurHost->h_addr_list[0]));
			}else {
				printf("Alguna clase de ERROR \n");
			}
			exit (2);
		}
	
	}else {
		// en caso de haber parametros
		addr = inet_addr(argv[1]);
		if (addr == -1){
			// Ver si es un nombre de nominio
			OurHost = gethostbyname(argv[1]);
			if (OurHost == NULL){
				printf("No existe este host.\n");
			}else {
				printf("Nombre  >\t%s\n", OurHost->h_name);
				printf("Addr    >\t%i\n", OurHost->h_addr_list[0]);
				printf("IP Addr   >\t%s\n", inet_ntoa( *(struct in_addr *) OurHost->h_addr_list[0]));
			}
		} else {
		
			OurHost = gethostbyaddr((char *)&addr, sizeof(addr), AF_INET);
			if (OurHost != NULL) {
			printf("Nombre  >\t%s\n", OurHost->h_name);
			printf("Addr    >\t%i\n", OurHost->h_addr_list[0]);
			printf("IP Addr   >\t%s\n", inet_ntoa( *(struct in_addr *) OurHost->h_addr_list[0]));
			} else {
				printf("Aluna clase de ERROR\n");
			}
		}
}
}
