2008-12-23 10 views
3

J'écris ou modifie des programmes qui effectuent la résolution de nom et ont besoin d'un bon contrôle du processus . Donc, je n'utilise pas getaddrinfo(), je vais plus profond et utiliser res_query()/res_send()/etc dans resolv.h, documenté dans le résolveur (3).En utilisant le résolveur de nom de resolv.h avec IPv6

Bien que n'étant pas documenté, le moyen le plus commun pour définir le résolveur utilisé est mise à jour _res.nsaddr_list. Mais ce tableau, défini dans resolv.h, stocke struct sockaddr_in, c'est-à-dire uniquement les adresses IPv4. (Adresses IPv6 sont struct sockaddr_in6, un système indépendant famille utiliserait struct sockaddr.)

Je suis à la recherche d'un moyen (portable de préférence, au moins parmi les divers Unix) pour 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 peux pas trouver plus dans un 7 récent FreeBSD (grep _res_ext /usr/include/resolv.h ne trouve rien). Vous pouvez toujours trouver code which uses it (essayez-vous with Google Codesearch). Grâce à Alnitak, j'ai remarqué qu'il est apparemment maintenant _res._ext et non .res_ext. Je me demande où ces sortes de choses sont documentées ou annoncées ... Je n'ai aucune idée de comment portable _res._ext est. Je peux le trouver sur Debian et FreeBSD. Il semble qu'il y ait peu de programmes qui l'utilisent.

Répondre

2

Stéphane - si votre resolv.h n'inclut aucun support pour alors cela suggère que sur votre O/S particulier le résolveur ne supporte pas lui-même le transport IPv6.

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

  • Mac OS X 10.5.6 - prend en charge la bibliothèque BIND 9, qui a une fonction res_setservers() qui peut prendre les adresses IPv6, aucune 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 ya un paramètre pour dire le résolveur de retourner les enregistrements AAAA avant de rechercher les enregistrements pour gethostbyname().

EDIT - aussi, le CVS repository pour FreeBSD suggère que FreeBSD 7.0 (voir l'étiquette FREEBSD_7_0_0_RELEASE) supporte aussi res_setservers() de Bind 9.

+0

Mais :-(sans papier susanna: ~% uname -r 7.0-RELEASE susanna: ~% man res_setservers Pas de saisie manuelle pour res_setservers – bortzmeyer

+0

Je ne trouve pas 'res_setservers' sur des machines Linux/glibc I. supposons qu'il n'y a pas de standard pour la résolution IPv6 :-( – bortzmeyer

+0

impair - c'est dans le fichier resolv.h :(Le symbole existe dans Mac OS X, bien que ce soit vraiment res_9_setservers et un #define donne accès à la version normale. – Alnitak

1

glibc:

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

mis ce dernier à 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 

Semble désordre à moi et vous aurez probablement besoin autoconf.