Forum Programmation.c Commande pour le résolveur de la libc

Posté par (page perso) .
Tags : aucun
5
17
août
2010
Vous savez sans doute que les logiciels clients réseau ne font généralement pas eux-mêmes leurs résolutions de noms d'hôtes en adresse IP : ils utilisent des fonctions de la libc, comme gethostbyname(3) ou getaddrinfo(3).

De son côté, la libc utilise le fichier de configuration nsswitch.conf(5) pour déterminer les méthodes à utiliser pour résoudre le nom qu'on lui soumet. En général, c'est :
  1. le fichier statique hosts(5) ;
  2. une requête mDNS ;
  3. une requête DNS.
D'autres méthodes sont disponibles, comme LDAP ou YP.

Avez-vous déjà eu besoin de savoir comme un logiciel, autrement dit la libc, allait résoudre un nom donné ? La commande host(1) ne convient pas, puisqu'elle fait juste de la résolution DNS. Et bien, voici une interface en ligne de commande pour le résolveur de la libc :
#include <stdio.h>
#include <netdb.h>
#include <arpa/inet.h>

void print_host_info(struct hostent *host)
{
int i ;
char *addr ;
char paddr[INET6_ADDRSTRLEN] ;
printf("Name: %s\n", host->h_name) ;
printf("Aliases:") ;
for (i = 0 ; host->h_aliases[i] != NULL ; i++)
{
printf(" %s", host->h_aliases[i]) ;
}
printf("\n") ;
printf("Address type: ") ;
switch (host->h_addrtype)
{
case AF_INET : printf("inet\n") ;
break ;
case AF_INET6 : printf("inet6\n") ;
break ;
}
printf("Address length: %d\n", host->h_length) ;
printf("Addresses:") ;
for (i = 0 ; host->h_addr_list[i] != NULL ; i++)
{
addr = host->h_addr_list[i] ;
printf(" %s", inet_ntop(host->h_addrtype, addr, paddr, INET6_ADDRSTRLEN)) ;
}
printf("\n") ;
}

int main(int argc, char **argv)
{
if (argc != 2)
{
printf("Need a single hostname.\n") ;
return 1 ;
}
struct hostent *host ;
char host4 = 0, host6 = 0 ;
if ((host = gethostbyname2(argv[1], AF_INET)))
{
host4 = 1 ;
print_host_info(host) ;
}
if (host4)
{
printf("\n") ;
}
if ((host = gethostbyname2(argv[1], AF_INET6)))
{
host6 = 1;
print_host_info(host) ;
}
if (!host4 && !host6)
{
printf("Host not found.\n") ;
}
return 0 ;
}


Ça s'utilise de la façon la plus simple qui soit :
gcc -Wall -o resolv resolv.c
./resolv www.linuxfr.org
  • # Pour une fois que c'est pas dans astuces ...

    Posté par . Évalué à 5.

    ... alors que je pense que ce bout de code devrait effectivement y être ! Merci.
  • # lapin compris

    Posté par . Évalué à 2.

    c'est soit
    Avez-vous déjà eu besoin de savoir comme un logiciel, autrement dit la libc, allait résoudre un nom donné ?
    soit
    Avez-vous déjà eu besoin de savoir comment un logiciel, autrement dit la libc, allait résoudre un nom donné ?

    mais pas les deux. Si ?
  • # Et sinon...

    Posté par . Évalué à 5.

    C'est pas le boulot de getent hosts de faire ça ?

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.