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 - Resolver-Routinen
Resolver-Bibliothek (
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 *dname, int class, int type,
unsigned char answer[.anslen], int anslen);
int res_nsearch(res_state statep,
const char *dname, int class, int type,
unsigned char answer[.anslen], int anslen);
int res_nquerydomain(res_state statep,
const char *name, const char *domain,
int class, int type, unsigned char answer[.anslen],
int anslen);
int res_nmkquery(res_state statep,
int op, const char *dname, int class,
int type, const unsigned char data[.datalen], int datalen,
const unsigned char *newrr,
unsigned char buf[.buflen], int buflen);
int res_nsend(res_state statep,
const unsigned char msg[.msglen], int msglen,
unsigned char answer[.anslen], int anslen);
int dn_comp(const char *exp_dn, unsigned char comp_dn[.length],
int length, unsigned char **dnptrs,
unsigned char **lastdnptr);
int dn_expand(const unsigned char *msg,
const unsigned char *eomorig,
const unsigned char *comp_dn, char exp_dn[.length],
int length);
[[veraltet]] extern struct __res_state _res;
[[veraltet]] int res_init(void);
[[veraltet]]
int res_query(const char *dname, int class, int type,
unsigned char answer[.anslen], int anslen);
[[veraltet]]
int res_search(const char *dname, int class, int type,
unsigned char answer[.anslen], int anslen);
[[veraltet]]
int res_querydomain(const char *name, const char *domain,
int class, int type, unsigned char answer[.anslen],
int anslen);
[[veraltet]]
int res_mkquery(int op, const char *dname, int class,
int type, const unsigned char data[.datalen], int datalen,
const unsigned char *newrr,
unsigned char buf[.buflen], int buflen);
[[veraltet]]
int res_send(const unsigned char msg[.msglen], int msglen,
unsigned char answer[.anslen], int anslen);
Hinweis: Diese Seite ist unvollständig (verschiedene durch Glibc
bereitgestellte Resolver-Funktionen sind nicht beschrieben) und ist
wahrscheinlich veraltet.
Diese unten beschriebenen Funktionen stellen Anfragen an Internet Domain
Nameserver und interpretieren die Rückmeldungen.
Das API besteht aus einer Gruppe von moderneren, wiedereintrittsfähigen
Funktionen und einer älteren Gruppe von überholten, nicht
wiedereintrittsfähigen Funktionen. Die traditionellen
Resolver-Schnittstellen wie
res_init() und
res_query() verwenden
einigen statischen (globalen) Zustand, der in der Struktur
_res
gespeichert ist, womit die Funktionen nicht Thread-sicher werden. BIND 8.2
führte eine Gruppe von neuen Schnittstellen
res_ninit(),
res_nquery() und so weiter ein, die
res_state als erstes
Argument übernehmen, so dass Sie pro Thread einen Resolver-Zustand
verwenden können.
Die Funktionen
res_ninit() und
res_init() lesen die
Konfigurationsdateien (siehe
resolv.conf(5)), um den vorgegebenen
Domainnamen und
Nameserveradresse(n) zu erhalten. Wenn kein Server angegeben
ist, wird der lokale Host verwendet. Wenn keine Domain angegeben ist, wird
diejenige benutzt, die dem lokalen Host zugeordnet ist. Dies kann mit der
Umgebungsvariablen
LOCALDOMAIN überschrieben werden.
res_ninit() oder
res_init() werden normalerweise durch den
ersten Aufruf von einer der anderen Funktionen ausgeführt. Jeder Aufruf
an
res_ninit() benötigt einen entsprechenden Aufruf an
res_nclose(), um den durch
res_ninit() und nachfolgende Aufrufe
von
res_nquery() reservierten Speicher freizugeben.
Die Funktionen
res_nquery() und
res_query() fragen den Nameserver
nach dem vollständigen Domain-Namen
name des spezifizierten Typs
type und der Klasse
class. Die Antwort verbleibt im Puffer
answer der Länge
anslen, der vom Aufrufenden
bereitgestellt wurde.
Die Funktionen
res_nsearch() und
res_search() stellen eine Anfrage
und wartet wie
res_nquery() und
res_query() auf die Antwort,
implementieren jedoch zusätzlich die Vorgabe- und Such-Regeln, die
durch
RES_DEFNAMES und
RES_DNSRCH gesteuert werden (siehe im
Folgenden die Beschreibung der
_res-Optionen).
Die Funktionen
res_nquerydomain() und
res_querydomain() stellen
mittels
res_nquery()/
res_query() eine Anfrage auf die Verkettung
von
name und
domain.
Die folgenden Funktionen sind Routinen tieferer Ebene, die von
res_nquery()/
res_query() benutzt werden.
Die Funktionen
res_nmkquery() und
res_mkquery() konstruieren eine
Anfragenachricht für den Domain-Namen
dname in
buf der
Länge
buflen. Der Anfragetyp
op ist einer der folgenden
(typischerweise
QUERY):
- QUERY
- Standardanfrage
- IQUERY
- Inverse Anfrage. Diese Option wurde in Glibc 2.26 entfernt,
da sie schon seit sehr langer Zeit nicht mehr von DNS-Servern
unterstützt wurde.
- NS_NOTIFY_OP
- Sekundäre über Änderungen an der SOA
(Start der Authorität) benachrichtigen.
newrr wird derzeit nicht verwandt.
Die Funktionen
res_nsend() und
res_send() senden eine
vorformatierte Anfrage, die in
msg gegeben ist und die Länge
msglen hat und gibt die Antwort in
answer zurück, die die
Länge
anslen hat. Sie rufen
res_ninit()/
res_init()
auf, falls sie noch nicht aufgerufen wurde.
Die Funktion
dn_comp() komprimiert den Domain-Namen
exp_dn und
speichert ihn in dem Puffer
comp_dn der Länge
length. Die
Komprimierung benutzt ein Feld von Zeigern
dnptrs auf bereits
komprimierte Namen in der aktuellen Nachricht. Der erste Zeiger zeigt auf den
Anfang der Nachricht und die Liste endet mit NULL. Die Grenze des Feldes ist
angegeben durch
lastdnptr. Wenn
dnptr NULL ist, dann sind
Domain-Namen nicht komprimiert. Wenn
lastdnptr NULL ist, dann wird die
Liste der Namen nicht aktualisiert.
Die Funktion
dn_expand() expandiert den komprimierten Domain-Namen
comp_dn zu einem vollen Domain-Namen, welcher in dem Puffer
exp_dn der Größe
length platziert ist. Der
komprimierte Name ist in einer Anfrage- oder Antwortnachricht enthalten und
msg zeigt auf den Anfang der Nachricht.
Die Resolver-Routinen benutzen in einer Struktur
__res_state (entweder
als Argument
statep übergeben oder im Falle der älteren,
nicht wiedereintrittsfähigen Funktion als globale Variable
_res)
enthaltende Konfigurations- und Zustandsinformationen. Das einzige Feld in
dieser Struktur, das normalerweise vom Benutzer manipuliert wird, ist das Feld
options. Dieses Feld kann bitweise Oder-Verknüpfungen der
folgenden Optionen enthalten:
- RES_INIT
- Wahr, falls res_ninit() oder res_init()
aufgerufen wurde.
- RES_DEBUG
- Gibt Debugging-Meldungen aus. Diese Option ist nur dann
verfügbar, wenn glibc mit Debugging-Unterstützung kompiliert
wurde, was allerdings nicht die Vorgabe ist.
-
RES_AAONLY (nicht implementiert; in Glibc 2.25
veraltet)
- Akzeptiere nur autoritative Antworten. res_send()
fährt fort, bis es eine autoritative Antwort findet oder gibt einen
Fehler zurück. Diese Option war bis Glibc 2.24 vorhanden, aber
nicht implementiert; seit Glibc 2.25 ist sie veraltet und ihre Verwendung
führt zu einer Fehlermeldung.
- RES_USEVC
- TCP-Verbindungen statt UDP-Datagramme für Anfragen
benutzen.
-
RES_PRIMARY (nicht implementiert; in Glibc 2.25
veraltet)
- Nur primäre Domain-Name-Server abfragen. Diese
Option war bis Glibc 2.24 vorhanden, aber nicht implementiert; seit Glibc
2.25 ist sie veraltet und ihre Verwendung führt zu einer
Fehlermeldung.
- RES_IGNTC
- Ignoriere Fehler bei verstümmelten Antworten.
Versuche es nicht erneut mit TCP.
- RES_RECURSE
- Setze das Rekursionswunsch-Bit in Anfragen. Rekursion wird
von dem Domainnameserver ausgeführt, nicht von res_send().
[Standardmäßig eingeschaltet]
- RES_DEFNAMES
- Falls gesetzt, fügt res_search() den
Vorgabedomainnamen an Einzelkomponentennamen an, d.h. an solchen, die
keinen Punkt enthalten. [Standardmäßig eingeschaltet]
- RES_STAYOPEN
- Benutzt mit RES_USEVC, um die TCP-Verbindung
zwischen Anfragen geöffnet zu halten.
- RES_DNSRCH
- Falls gesetzt, sucht res_search() nach Hostnamen in
der aktuellen und in übergeordneten Domains. Diese Option wird von
gethostbyname(3) benutzt. [Eingeschaltet durch Vorgabe.]
- RES_INSECURE1
- Akzeptiert eine Antwort von einem falschen Server. Dies
kann zur Erkennung möglicher Sicherheitsrisiken verwandt werden.
Sie müssen dafür aber Glibc mit aktivierter Fehlersuche
übersetzen und die (nur zur Fehlersuche gedachte) Option
RES_DEBUG verwenden.
- RES_INSECURE2
- Akzeptiert eine Antwort, die eine falsche Anfrage
enthält. Dies kann zur Erkennung möglicher
Sicherheitsrisiken verwandt werden. Sie müssen dafür aber
Glibc mit aktivierter Fehlersuche übersetzen und die (nur zur
Fehlersuche gedachte) Option RES_DEBUG verwenden.
- RES_NOALIASES
- Deaktiviert die Verwendung der Umgebungsvariablen
HOSTALIASES.
- RES_USE_INET6
- Versucht innerhalb der Funktion gethostbyname(3)
zuerst eine AAAA-Anfrage vor einer A-Anfrage und bildet IPv4-Antworten in
eine IPv6 »getunnelte Form« ab, falls keine
AAAA-Datensätze aber eine A-Datensatzgruppe existiert. Seit Glibc
2.25 ist diese Option veraltet und ihre Verwendung führt zu einer
Warnung. Anwendungen sollten getaddrinfo(3) statt
gethostbyname(3) verwenden.
- RES_ROTATE
- Führt zur Ringauswahl der Name-Server aus den
aufgeführten. Damit wird die Abfragelast unter allen Servern
verteilt, statt dass alle Clients immer zuerst den zuerst
aufgeführten Server ausprobieren.
-
RES_NOCHECKNAME (nicht implementiert; in Glibc 2.25
veraltet)
- Deaktiviert die moderne Prüfung von BIND der
eingehenden Rechner- und Mailnamen auf ungültige Zeichen wie
Unterstrich (_), Zeichen außerhalb von ASCII oder Steuerzeichen.
Diese Option war bis Glibc 2.24 vorhanden, aber nicht implementiert; seit
Glibc 2.25 ist sie veraltet und ihre Verwendung führt zu einer
Fehlermeldung.
-
RES_KEEPTSIG (nicht implementiert; in Glibc 2.25
veraltet)
- TSIG-Datensätze nicht entfernen. Diese Option war
bis Glibc 2.24 vorhanden, aber nicht implementiert; seit Glibc 2.25 ist
sie veraltet und ihre Verwendung führt zu einer Fehlermeldung.
-
RES_BLAST (nicht implementiert; in Glibc 2.25
veraltet)
- Sendet jede Anfrage simultan und rekursiv an alle Server.
Diese Option war bis Glibc 2.24 vorhanden, aber nicht implementiert; seit
Glibc 2.25 ist sie veraltet und ihre Verwendung führt zu einer
Fehlermeldung.
-
RES_USEBSTRING (Glibc 2.3.4 bis 2.24)
- Erzeugt IPv6-Rückwärtssuchen mit dem in RFC
2673 beschriebenen Bitlabel-Format. Falls diese Option nicht gesetzt ist
(was die Vorgabe ist), wird das Nibble-Format verwendet. Diese Option
wurde in Glibc 2.25 entfernt, da sie eine nicht abwärtskompatible
DNS-Erweiterung benötigt, die im Internet niemals zur
Verfügung stand.
-
RES_NOIP6DOTINT (Glibc 2.24 und ältere)
- Verwendet die Zone ip6.arpa statt ip6.int in
inversen IPv6-Ermittlungen. Dies wird seit Glibc 2.3.4 misbilligt. Diese
Option ist bis einschließlich Glibc 2.24, in denen sie
standardmäßig aktiviert ist, enthalten. In Glibc 2.25 wurde
diese Option entfernt.
-
RES_USE_EDNS0 (seit Glibc 2.6)
- Aktiviert die Unterstützung für in RFC 2671
beschriebene DNS-Erweiterungen (EDNS0).
-
RES_SNGLKUP (seit Glibc 2.10)
- Standardmäßig führt Glibc IPv4- und
IPv6-Ermittlungen seit Glibc 2.9 parallel durch. Einige
DNS-Servergeräte können diese Anfragen nicht korrekt
handhaben und führen zu Zeitüberschreitungen bei den
Anfragen. Diese Option deaktiviert das Verhalten und lässt Glibc
die IPv6- und IPv4-Anfragen sequenziell durchführen (allerdings
verlangsamt sich der Auflösungsprozess dadurch etwas).
- RES_SNGLKUPREOP
- Wenn die Option RES_SNGLKUP aktiviert ist, wird
für jede Anfrage ein neuer Socket geöffnet.
- RES_USE_DNSSEC
- DNSSEC mit Bit OK im OPT-Datensatz verwenden. Diese Option
impliziert RES_USE_EDNS0.
- RES_NOTLDQUERY
- Nicht qualifizierte Namen nicht als Domain oberster Ebene
(TLD) nachschlagen.
- RES_DEFAULT
- Standardoption, impliziert: RES_RECURSE,
RES_DEFNAMES, RES_DNSRCH und RES_NOIP6DOTINT.
Die Funktionen
res_ninit() und
res_init() geben 0 bei Erfolg
zurück oder -1, falls ein Fehler auftritt.
Die Funktionen
res_nquery(),
res_query(),
res_nsearch(),
res_search(),
res_nquerydomain(),
res_querydomain(),
res_nmkquery(),
res_mkquery(),
res_nsend() und
res_send() geben die Länge der Antwort zurück oder -1,
falls ein Fehler auftritt.
Die Funktionen
dn_comp() und
dn_expand() geben die Länge
des komprimierten Namens zurück oder -1, falls ein Fehler auftritt.
Falls mit einem Fehler von
res_nquery(),
res_query(),
res_nsearch(),
res_search(),
res_nquerydomain() oder
res_querydomain() zurückgekehrt wird, kann die globale Variable
h_errno (siehe
gethostbyname(3)) zur Bestimmung der
Fehlerursache herangezogen werden.
- /etc/resolv.conf
- Konfigurationsdatei des Resolvers
(Namensauflöser)
- /etc/host.conf
- Konfigurationsdatei des Resolvers
(Namensauflöser)
Siehe
attributes(7) für eine Erläuterung der in diesem
Abschnitt verwandten Ausdrücke.
Schnittstelle |
Attribut |
Wert |
res_ninit(), res_nclose(), res_nquery(),
res_nsearch(), res_nquerydomain(), res_nsend() |
Multithread-Fähigkeit |
MT-Safe locale |
res_nmkquery(), dn_comp(), dn_expand() |
Multithread-Fähigkeit |
MT-Safe |
4.3BSD.
gethostbyname(3),
resolv.conf(5),
resolver(5),
hostname(7),
named(8)
Die Quelldatei der GNU-C-Bibliothek
resolv/README.
Die deutsche Übersetzung dieser Handbuchseite wurde von Martin Eberhard
Schauer <
[email protected]>, Dr. Tobias Quathamer
<
[email protected]>, Helge Kreutzmann <
[email protected]> und
Mario Blättermann <
[email protected]> erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die
GNU
General Public License Version 3 oder neuer bezüglich der
Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken
Sie bitte eine E-Mail an die
Mailingliste
der Übersetzer