Utiliser le nom résolveur de resolv.h avec IPv6

J’écris ou modifie des programmes qui résolvent le nom et ont besoin d’un bon contrôle du processus. Donc, je n’utilise pas getaddrinfo() , je vais plus loin et j’utilise res_query() / res_send() / etc dans resolv.h , documenté dans resolver (3).

Bien que non documenté, la méthode habituelle pour définir le résolveur utilisé consiste à mettre à jour _res.nsaddr_list . Mais ce tableau, défini dans resolv.h, stocke la struct sockaddr_in , c’est-à-dire les adresses IPv4 uniquement. (Les adresses IPv6 sont struct sockaddr_in6 , un système indépendant de la famille utiliserait struct sockaddr .)

Je cherche un moyen (de préférence portable, au moins parmi les différentes Unix) de dire à _res que je veux aussi les adresses IPv6.

Apparemment, il y a longtemps, il y avait dans FreeBSD un _res_ext avec cette capacité, mais je ne le trouve plus dans un récent FreeBSD 7 ( grep _res_ext /usr/include/resolv.h ne trouve rien). Vous pouvez toujours trouver le code qui l’utilise (essayez-vous avec Google Codesearch ).

Grâce à Alnitak, j’ai remarqué que c’était apparemment maintenant _res._ext et non .res_ext . Je me demande où ce genre de choses est documentée ou annoncée … Je n’ai aucune idée de la portabilité de _res._ext . Je peux le trouver sur Debian et FreeBSD. Il semble que peu de programmes l’utilisent.

Stéphane – si votre resolv.h n’inclut aucun support pour sockaddr_in6 cela suggère que sur votre système d’exploitation particulier, le résolveur ne prend pas en charge le transport IPv6.

J’ai vérifié certains de mes systèmes ici:

  • MacOS X 10.5.6 – prend en charge la bibliothèque BIND 9, dotée d’une fonction res_setservers() pouvant prendre des adresses IPv6, sans extension _res._ext .

  • CentOS 5.2 a l’extension _res._ext , bien qu’il n’y ait aucune mention d’IPv6 dans la page de manuel pour resolv.conf sauf qu’il existe un paramètre permettant au résolveur de renvoyer des enregistrements AAAA avant de rechercher des enregistrements A pour gethostbyname() .

EDIT – également, le référentiel CVS pour FreeBSD suggère que FreeBSD 7.0 (voir balise FREEBSD_7_0_0_RELEASE ) supporte également res_setservers() partir de Bind 9.

glibc:

 res_setservers: no __res_state._u._ext.nsaddrs __res_state._u._ext.nsmap 

définissez ce dernier sur MAXNS + 1 selon:

http://sourceware.org/ml/libc-hacker/2002-05/msg00035.html

BSD-libc:

 res_setservers: yes __res_state._u._ext.__res_state_ext 

Cela me semble malpropre et vous aurez probablement besoin de autoconf.