res_ninit, res_nquery, res_nsearch, res_nquerydomain, res_nmkquery, res_nsend,
res_nclose, res_init, res_query, res_search, res_querydomain, res_mkquery,
res_send, dn_comp, dn_expand - Routines de résolution de noms
Bibliothèque resolver (
libresolv,
-lresolv)
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <resolv.h>
struct __res_state;
typedef struct __res_state *res_state;
int res_ninit(res_state statep);
void res_nclose(res_state statep);
int res_nquery(res_state statep,
const char *nom_dom, int classe, int type,
unsigned char réponse[.long_réponse], int long_réponse);
int res_nsearch(res_state statep,
const char *nom_dom, int classe, int type,
unsigned char réponse[.long_réponse], int long_réponse);
int res_nquerydomain(res_state statep,
const char *nom, const char *domaine,
int classe, int type, unsigned char réponse[.long_réponse],
int long_réponse);
int res_nmkquery(res_state statep,
int op, const char *nom_dom, int classe,
int type, const unsigned char données[.|long_données], intlong_données,
const unsigned char *newrr,
unsigned char tampon[.long_tampon], int long_tampon,
int res_nsend(res_state statep,
const unsigned char msg[.long_msg], int long_msg,
unsigned char réponse[.long_réponse], int long_réponse);
int dn_comp(const char *dom_exp, unsigned char dom_comp[.taille],
int taille, unsigned char **dnptrs,
unsigned char **lastdnptr);
int dn_expand(const unsigned char *msg,
const unsigned char *eomorig,
const unsigned char *dom_comp, char dom_exp[.taille],
int taille);
[[obsolète]] extern struct __res_state _res;
[[obsolète]] int res_init(void);
[[obsolète]]
int res_query(const char *nom_dom, int classe, int type,
unsigned char réponse[.long_réponse], int long_réponse);
[[obsolète]]
int res_search(const char *nom_dom, int classe, int type,
unsigned char réponse[.long_réponse], int long_réponse);
[[obsolète]]
int res_querydomain(const char *nom, const char *domaine,
int classe, int type, unsigned char réponse[.long_réponse],
int long_réponse);
[[obsolète]]
int res_mkquery(int op, const char *nom_dom, int classe,
int type, const unsigned char données[.long_données], int long_données,
const unsigned char *newrr,
unsigned char tampon[.long_tampon], int long_tampon);
[[obsolète]]
int res_send(const unsigned char msg[.long_msg], int long_msg,
unsigned char réponse[.long_msg], int long_réponse);
Note : Cette page est incomplète (diverses fonctions
resolver fournies par la glibc n'y sont pas décrites) et probablement
plus d'actualité.
Les fonctions ci-dessous interrogent et interprètent les réponses
de serveurs de noms Internet.
L'API consiste en un jeu de fonctions réentrantes plus moderne et d'un
ancien jeu de fonctions non réentrantes qui ont été
supplantées. Les interfaces traditionnelles de resolver telles que
res_init() et
res_query utilisent des états statiques
(globaux) stockés dans la structure
_res, rendant ces fonctions
« non-thread-safe ». BIND 8.2 introduit un
ensemble de nouvelles interfaces
res_ninit(),
res_nquery, et
ainsi de suite, qui prennent un
res_state comme premier argument, afin
de pouvoir utiliser un état de résolution par thread.
Les fonctions
res_init() et
res_init lisent les fichiers de
configuration (consultez
resolv.conf(5)) pour obtenir le nom de domaine
par défaut et l'adresse du ou des serveurs de noms. Si aucun serveur
n'est donné, l'hôte local est essayé. Si aucun domaine
n'est donné, celui associé à l'hôte local est
utilisé. Cela peut être surchargé par la variable
d'environnement
LOCALDOMAIN.
res_init() ou
res_ninit est
normalement exécutée lors du premier appel à l'une des
autres fonctions. Tout appel à
res_ninit() nécessite un
appel correspondant à
res_nclose pour libérer la
mémoire allouée à
res_ninit() et les appels
suivants à
res_nquery().
Les fonctions
res_nquery() et
res_query() interrogent le serveur
de noms pour le nom de domaine pleinement qualifié
nom du
type indiqué, et de la
classe donnée. La
réponse est placée dans le tampon
réponse de
longueur
long_réponse qui doit être fourni par
l'appelant.
Les fonctions
res_nsearch() et
res_search() interrogent un serveur
et attendent la réponse, comme
res_nquery() et
res_query(), mais implémentent en plus les règles de
recherche et de valeurs par défaut contrôlées par
RES_DEFNAMES et
RES_DNSRCH (voir les options de
_res plus
bas).
La fonction
res_querydomain() ou
res_nquerydomain interroge le
serveur en appelant
res_nquery() ou
res_query() avec la
concaténation de
nom et
domaine.
Les fonctions suivantes sont des routines bas niveau utilisées par
res_nquery() et
res_query().
Les fonctions
res_mkquery() et
res_nmkquery construisent une
requête dans
tampon de longueur
long_tampon concernant le
nom de domaine
nom_dom. Le type
op de requête est l'un
des suivants (généralement
QUERY) :
- QUERY
- Requête standard.
- IQUERY
- Requête inverse. Cette option a été
supprimée dans la glibc 2.26, car elle n'est plus prise en
charge par les serveurs DNS depuis très longtemps.
- NS_NOTIFY_OP
- Notifier au serveur secondaire le changement de SOA (Start
of Authority).
newrr est actuellement inutilisé.
Les fonctions
res_nsend() et
res_send() envoient une
requête préformatée, située dans
msg de
longueur
long_msg et renvoient la réponse dans
réponse qui est de longueur
long_réponse. Elles
appellent
res_ninit() ou
res_init(), si ça n'a pas encore
été fait.
La fonction
dn_comp() compresse le nom de domaine
dom_exp et le
stocke dans le tampon
dom_comp de longueur
taille. La
compression utilise une table de pointeurs
dnptrs vers les noms
précédemment compressés du message en cours. Le premier
pointeur vise le début du message, et la table se termine par NULL. La
limite de la table est indiquée par
lastdnptr. Si
dnptr
est NULL, les noms de domaines ne sont pas compressés. Si
lastdnptr est NULL, la liste d'étiquettes n'est pas mise
à jour.
La fonction
dn_expand() développe le nom de domaine
compressé
dom_comp en un nom de domaine complet qui est ensuite
placé dans le tampon
dom_exp de taille
taille. Le nom
compressé est contenu dans une requête ou dans un message de
réponse, et
msg pointe sur le début du message.
Les routines de résolution de noms utilisent une configuration globale et
des informations d'état contenues dans la structure
_res_state
(soit transmis en tant qu'argument
statep, soit dans la variable
globale
_res, dans le cas des anciennes fonctions non
réentrantes). Le seul champ de cette structure habituellement
manipulé par l'utilisateur est le champ
options. Il contient un
OU binaire entre les options suivantes :
- RES_INIT
- Vrai si res_init() ou res_ninit() a
été appelée.
- RES_DEBUG
- Afficher les messages de débogage. Cette option
n'est disponible que si le débogage a été
activé lors de la construction de la glibc, ce qui n'est pas le cas
par défaut.
-
RES_AAONLY (non implémenté ;
obsolète depuis la glibc 2.25)
- N'accepter que les réponses des serveurs faisant
autorité. res_send() continue jusqu'à trouver un
serveur faisant autorité ou renvoie une erreur. Cette option
était présente, mais non implémentée, dans la
glibc jusqu'à la version 2.24 ; elle est
obsolète depuis la glibc 2.25 et provoque un avertissement
si elle est utilisée.
- RES_USEVC
- Utiliser des connexions TCP pour les interrogations
plutôt que des datagrammes UDP.
-
RES_PRIMARY (non implémenté ;
obsolète depuis la glibc 2.25)
- Interroger uniquement le serveur primaire de noms de
domaine. Cette option était présente, mais non
implémentée, dans la glibc jusqu'à la
version 2.24 ;mais elle est obsolète depuis la
glibc 2.25 et son usage provoque un avertissement.
- RES_IGNTC
- Ignorer les erreurs de troncature. Ne pas réessayer
avec TCP.
- RES_RECURSE
- Définir le bit de récursion dans les
requêtes. La récursion est prise en charge par le serveur de
noms du domaine et non par res_send() [activé par
défaut].
- RES_DEFNAMES
- S'il est défini, res_search() ajoutera le nom
de domaine par défaut aux noms simples, c'est-à-dire ceux ne
contenant pas de point [activé par défaut].
- RES_STAYOPEN
- Utilisée avec RES_USEVC pour garder ouverte
une connexion TCP entre des interrogations successives.
- RES_DNSRCH
-
res_search() recherchera les noms d'hôtes
dans le domaine courant et dans les domaines parents. Cette option est
utilisée par gethostbyname(3) [activé par
défaut].
- RES_INSECURE1
- Accepter une réponse d'un mauvais serveur. Cela peut
être utilisé pour détecter de potentiels risques de
sécurité, mais vous devez compiler la glibc avec le
débogage activé et utiliser l'option RES_DEBUG (aux
fins de débogage uniquement).
- RES_INSECURE2
- Accepter les réponses contenant une mauvaise
requête. Cela peut-être utilisé pour détecter
des failles de sécurité, mais vous devez compiler glibc avec
le débogage activé et utiliser l'option RES_DEBUG
(aux fins de débogage uniquement).
- RES_NOALIASES
- Désactiver l'utilisation de la variable
d'environnement HOSTALIASES.
- RES_USE_INET6
- Essayer une requête AAAA avant une
requête A dans la fonction gethostbyname(3) et mapper
les réponses IPv4 dans la « forme
tunnellisée » de IPv6 si aucun enregistrement AAAA
n'est trouvé alors qu'un enregistrement A existe. Cette
option est obsolète depuis la glibc 2.25 et son utilisation
provoque un avertissement ; les applications doivent utiliser
getaddrinfo(3) à la place de gesthostbyname(3).
- RES_ROTATE
- Provoquer une sélection en tourniquet
(« round-robin ») des serveurs de noms parmi
ceux qui sont listés. Cela a pour effet de diffuser la
requête vers tous les serveurs listés et d'éviter
ainsi que les clients essaient chaque fois le premier serveur
listé.
-
RES_NOCHECKNAME (non
implémenté ; obsolète depuis la glibc 2.25)
- Désactiver la vérification BIND moderne des
noms d'hôtes et de courriers entrants pour les caractères
incorrects comme le caractère souligné
« _ », les caractères non ASCII ou les
caractères de contrôle. Cette option était
présente jusqu'à la glibc 2.24, mais est
obsolète depuis la glibc 2.25 et son usage provoque un
avertissement.
-
RES_KEEPTSIG (non implémenté ;
obsolète dans la glibc 2.25)
- Ne pas dépouiller les enregistrements TSIG. Cette
option était présente, mais non implémentée
jusqu'à la glibc 2.24 ; depuis glibc 2.25
cette option est obsolète et son utilisation provoque un
avertissement.
-
RES_BLAST (non implémenté ;
obsolète depuis la glibc 2.25)
- Envoyer chaque requête simultanément et
récursivement à tous les serveurs. Cette option était
présente, mais non implémentée dans la glibc
jusqu'à sa version 2.24 ; depuis la glibc 2.25
cette option est obsolète et son utilisation provoque un
avertissement.
-
RES_USEBSTRING (de la glibc 2.3.4 à la glibc
2.24)
- Effectuer des recherches inversées sur IPv6 en
utilisant le format bit-label décrit dans la RFC 2673 ; si
cette option n'est pas présente (ce qui est le cas par
défaut), alors le format nibble est utilisé. Cette option a
été supprimée dans la glibc 2.25, car elle
faisait appel à une extension DNS non rétrocompatible qui
n'était jamais employée sur Internet.
-
RES_NOIP6DOTINT (glibc 2.24 et
précédentes)
- Utiliser la zone ip6.arpa dans une recherche
inversée IPv6 au lieu de ip6.int qui est obsolète
depuis la glibc 2.3.4. Cette option est présente dans la
glibc jusqu'à la glibc 2.24 incluse, où elle est
activée par défaut. Cette option a été
supprimée dans la glibc 2.25.
-
RES_USE_EDNS0 (depuis la glibc 2.6)
- Activer la prise en charge des extensions DNS (EDNS0)
décrites dans la RFC 2671.
-
RES_SNGLKUP (depuis la glibc 2.10)
- Par défaut, la glibc réalise des
résolutions IPv4 et IPv6 en parallèle depuis la
glibc 2.9. Certains serveurs d'application DNS ne peuvent pas
traiter correctement ces demandes et font expirer les requêtes.
Cette option désactive ce comportement et force la glibc à
réaliser les requêtes IPv4 et IPv6 de façon
séquentielle (au prix d'un certain ralentissement du processus de
résolution).
- RES_SNGLKUPREOP
- Ouvrir un nouveau socket à chaque requête
quand l'option RES_SNGLKUP est activée.
- RES_USE_DNSSEC
- Utiliser DNSSEC avec un bit OK dans l'enregistrement OPT.
Cette option implique RES_USE_ENDS0.
- RES_NOTLDQUERY
- Ne pas rechercher un nom non qualifié comme domaine
de premier niveau (top-level domain (TLD)).
- RES_DEFAULT
- Option par défaut qui implique :
RES_RECURSE, RES_DEFNAMES, RES_DNSRCH et
RES_NOIP6DOTINT.
Les fonctions
res_ninit() et
res_init() renvoient
0 si
elles réussissent ou
-1 si une erreur se produit.
Les fonctions
res_nquery(),
res_query(),
res_nsearch(),
res_search(),
res_nquerydomain(),
res_querydomain(),
res_nmkquery(),
res_mkquery(),
res_nsend() et
res_send() renvoient la longueur de la réponse ou
-1 si
une erreur se produit.
Les fonctions
dn_comp() et
dn_expand() renvoient la longueur du
nom compressé ou
-1 si une erreur se produit.
Dans le cas d'une erreur renvoyée par
res_nquery(),
res_query(),
res_nsearch(),
res_search(),
res_nquerydomain() ou
res_querydomain(), la variable globale
h_erno (voir
gethostbyname(3)) peut être consultée
pour déterminer la cause de l'erreur.
- /etc/resolv.conf
- fichier de configuration de resolver (résolution de
noms)
- /etc/host.conf
- fichier de configuration de resolver (résolution de
noms)
Pour une explication des termes utilisés dans cette section, consulter
attributes(7).
Interface |
Attribut |
Valeur |
res_ninit(), res_nclose(), res_nquery(),
res_nsearch(), res_nquerydomain(), res_nsend() |
Sécurité des threads |
MT-Safe locale |
res_nmkquery(), dn_comp(), dn_expand() |
Sécurité des threads |
MT-Safe |
4.3BSD.
gethostbyname(3),
resolv.conf(5),
resolver(5),
hostname(7),
named(8)
Le fichier source
resolv/README de la bibliothèque GNU C.
La traduction française de cette page de manuel a été
créée par Christophe Blaess
<
https://www.blaess.fr/christophe/>, Stéphan Rafin
<
[email protected]>, Thierry Vignaud
<
[email protected]>, François Micaux, Alain Portal
<
[email protected]>, Jean-Philippe Guérard
<
[email protected]>, Jean-Luc Coulon (f5ibh)
<
[email protected]>, Julien Cristau
<
[email protected]>, Thomas Huriaux <
[email protected]>,
Nicolas François <
[email protected]>, Florentin
Duneau <
[email protected]>, Simon Paillard
<
[email protected]>, Denis Barbier
<
[email protected]>, David Prévot <
[email protected]> et
bubu <
[email protected]>
Cette traduction est une documentation libre ; veuillez vous reporter
à la
GNU
General Public License version 3 concernant les conditions de copie
et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message à
[email protected]