/*
Rodolfo A. Quijano R.
450218 ISC 98 6to Semestre
qramos@prodigy.net.mx
Fecha de Creacion: 30 de Enero del 2001
Fecha de Ultima Modificacion: 31 de Enero del 2001
Sistemas Operativos 2
Tarea: Gethostbyname/Gethostbyaddr (DNS)
Archivo: rododns.c
Compilacion:
gcc rododns.c -lsocket -lnsl -o rododns
Ejecucion:
rododns 124.56.123.10
rododns www.yahoo.com
Plataforma: UNIX/SUN*/

/*El siguiente programa simula un DNS simple, obteniendo el IP de un
hostname o un hostname de un IP*/


#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

int main(int argc, const char **argv)
{ulong_t dir;
 struct hostent *hn;
 char **e;

/*Checar si el numero de argumentos son los correctos*/

 if (argc != 2)
 {(void) printf("Dato: %s faltante\n", argv[0]);
  exit (1);}

/*Verificara que es lo que esta buscando. Si argv1 empieza
con un numero entonces es IP-nombre, si no es ne nombre-IP*/

 if (argv[1][0]>='0'&&argv[1][0]<='9')
  {
/*Se checa que el IP se haya dado de manera xxx.xxx.xxx.xxx
  y ademas se guarda el IP en la variable dir*/

  if ((int)(dir = inet_addr(argv[1])) == -1)
  {(void) printf("La direccion no esta en formato IP: xxx.xxx.xxx.xxx\n");
   exit (2);}

/*Obtendra el apuntador a la estructura que contiene los datos del IP
tecleado por el usuario y mandado atraves de la variable dir*/
 
  hn = gethostbyaddr((char *)&dir, sizeof (dir), AF_INET);

/*Si regresa apuntador nulo es que el host no existe*/

  if (hn == NULL)
  {(void) printf("El host %s no existe\n", argv[1]);
   exit (3);}

/*Se obtendran los datos deseados apartir del struct hostent regresado*/ 

  for (e = hn->h_addr_list; *e != 0; e++)
  {struct in_addr intr;
   char **r;

/*Se copia la direccion a una nueva estructura intr*/

   (void) memcpy(&intr.s_addr, *e, sizeof (intr.s_addr));

/*Se imprime la informacion del IP y su nombre*/

   (void) printf("El IP %s corresponde a: %s", inet_ntoa(intr), hn->h_name);

/*Se imprimen aliases encontrados en la estructura*/

   for (r = hn->h_aliases; *r != 0; r++)
    (void) printf(" %s", *r);
   (void) putchar('\n');
  } //se cierra el for
 }  //se cierra el if de si es IP-nombre
 else
 {

/*Obtendra el apuntador a la estructura que contiene los datos del nombre
tecleado por el usuario*/

  hn=gethostbyname(argv[1]);

/*Si regresa apuntador nulo es que el host no existe*/

  if(hn==NULL)
  {(void) printf("El host %s no existe\n",argv[1]);
   exit(3);}

/*Se obtendran los datos deseados apartir del struct hostent regresado*/ 

  for (e = hn->h_addr_list; *e != 0; e++)
  {struct in_addr intr;
   char **r;

/*Se copia la direccion a una nueva estructura intr*/

   (void) memcpy(&intr.s_addr, *e, sizeof (intr.s_addr));

/*Se imprime la informacion del IP y su nombre*/

   (void) printf("El Host %s corresponde al IP: %s", hn->h_name, inet_ntoa(intr));

/*Se imprimen aliases encontrados en la estructura*/

   for (r = hn->h_aliases; *r != 0; r++)
    (void) printf(" %s", *r);
   (void) putchar('\n');
  } //se cierra el for 
 } //se cierra el else para Nombre-IP
exit (0);
}    