res_ninit(3) res_nmkquery,

ОБЗОР

#include <netinet/in.h>
#include <arpa/nameser.h>
#include <resolv.h>
struct __res_state;
typedef struct __res_state *res_state;
int res_ninit(void);
int res_nquery(res_state statep,
const char *dname, int class, int type,
unsigned char *answer, int anslen);
int res_nsearch(res_state statep,
const char *dname, int class, int type,
unsigned char *answer, int anslen);
int res_nquerydomain(res_state statep,
const char *name, const char *domain,
int class, int type, unsigned char *answer,
int anslen);
int res_nmkquery(res_state statep,
int op, const char *dname, int class,
int type, const unsigned char *data, int datalen,
const unsigned char *newrr,
unsigned char *buf, int buflen);
int res_nsend(res_state statep,
const unsigned char *msg, int msglen,
unsigned char *answer, int anslen);
int dn_comp(const char *exp_dn, unsigned char *comp_dn,
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,
int length);

Устаревшие

extern struct __res_state _res;

int res_init(void);

int res_query(const char *dname, int class, int type,
           unsigned char *answer, int anslen);

int res_search(const char *dname, int class, int type,
           unsigned char *answer, int anslen);

int res_querydomain(const char *name, const char *domain,
           int class, int type, unsigned char *answer,
           int anslen);

int res_mkquery(int op, const char *dname, int class,
           int type, const unsigned char *data, int datalen,
           const unsigned char *newrr,
           unsigned char *buf, int buflen);

int res_send(const unsigned char *msg, int msglen,
           unsigned char *answer, int anslen);

Компонуется при указании параметра -lresolv.

ОПИСАНИЕ

Замечание: Данная страница не полна (не описаны различные функции определителя, предоставляемые glibc) и, вероятно, содержит устаревшую информацию.

Описываемые далее функции выполняют запросы и обрабатывают ответы, полученные от серверов доменных имён Интернет.

В программный интерфейс входят как современные, реентерабельные функции, так и устаревшие не реентерабельные. Функции res_init() и res_query() из обычного интерфейса определителя использует статическое (глобальное) состояние, хранимое в структуре _res, что делает эти функции небезопасным при использовании в нитях. В BIND 8.2 появился набор новых интерфейсов res_ninit(), res_nquery() и т. п., в котором res_state указывается в третьем аргументе, что позволяет использовать отдельное состояние определителя в каждой нити.

Функции res_ninit() и res_init() читают файлы настройки (смотрите resolv.conf(5)) для получения имени домена по умолчанию и адреса(-ов) сервера имён. Если серверы не заданы, то используется локальный узел. Если не задан домен, то используется домен локального узла. Это может быть изменено через переменную окружения LOCALDOMAIN. Обычно, функция res_ninit() или res_init() выполняется первой из других функций.

Функции res_nquery() и res_query() запрашивают у сервера имён полное доменное имя name заданного типа type и класса class. Ответ помещается в буфер answer длиной anslen, указанный вызывающим.

Функции res_nsearch() и res_search() отправляют запрос и ждут ответа, подобно res_nquery() и res_query(), но при этом ещё учитывают правила работы и поиска по умолчанию, настраиваемые через RES_DEFNAMES и RES_DNSRCH (смотрите ниже описание параметров _res).

Функции res_nquerydomain() и res_querydomain() отправляют запрос с помощью res_nquery()/res_query() с объединённым name и domain.

Следующие функции являются процедурами низкого уровня, которые используются res_nquery()/res_query().

Функции res_nmkquery() и res_mkquery() создают сообщение-запрос в buf длиной buflen для имени домена dname. Тип op запроса обычно равен QUERY, но может содержать значение любого типа, которые определены в <arpa/nameser.h>. В данный момент newrr не используется.

Функции res_nsend() и res_send() посылают заранее созданный запрос, указанный в msg длиной msglen, и возвращают ответ в answer длиной anslen. Вызывают функцию res_ninit()/res_init(), если этого ещё не было.

Функция dn_comp() сжимает имя домена exp_dn и сохраняет его в буфере comp_dn длиной length. Сжатие использует массив указателей dnptrs на предварительно сжатые имена в текущем сообщении. Первый указатель обозначает начало сообщения, а весь список оканчивается NULL. Предел массива определяется в lastdnptr. Если dnptr равно NULL, то имя домена не является сжатым. Если lastdnptr равно NULL, то список меток не обновляется.

Функция dn_expand() раскрывает сжатое имя домена comp_dn до полного доменного имени, которое затем сохраняется в буфере exp_dn длиной length. Сжатое имя содержится в запросе или ответном сообщении, а msg указывает на начало сообщения.

Процедуры определителя используют настройки и информацию о состоянии из структуры __res_state (переданной в аргументе statep или в глобальной переменной _res, если используются старые не реентерабельные функции). Обычно, пользователь изменяет в этой структуре только поле options. Данное поле может содержать следующие значения, объединённые с помощью «OR»:

RES_INIT
Истинно, если уже вызывалась функция res_ninit() или res_init().
RES_DEBUG
Печатать отладочные сообщения. Этот параметр доступен только, если glibc собрана с включённой отладкой, которая по умолчанию выключена.
RES_AAONLY
Принимать только авторизованные ответы. Функция res_send() продолжает работу, пока не найдет авторизованный ответ, или возвращает ошибку (в данный момент не реализовано).
RES_USEVC
использовать TCP-соединение для запросов вместо датаграмм UDP.
RES_PRIMARY
Запрашивать только первичный сервер доменных имён (в данный момент не реализовано).
RES_IGNTC
Игнорировать ошибки обрезания. Не пытаться повторить запрос с помощью TCP.
RES_RECURSE
Установить в запросах бит рекурсии. Рекурсия выполняется сервером доменных имён, а не функцией res_send() (включено по умолчанию).
RES_DEFNAMES
Если указан, то res_search() будет добавлять имя домена по умолчанию к именам с одним компонентом в имени (не содержащим точек) (включено по умолчанию).
RES_STAYOPEN
Используется вместе с RES_USEVC для поддержания TCP-соединения запросов между ответами.
RES_DNSRCH
Если указан, то res_search() будет искать имена узлов в текущем и родительском домене. Этот параметр используется gethostbyname(3) (включено по умолчанию).
RES_INSECURE1
Принимать ответ от ошибочного сервера. Может использоваться для обнаружения потенциальных угроза безопасности, но требует перекомпиляции glibc с включённой отладкой и параметром RES_DEBUG (только для отладки).
RES_INSECURE2
Принимать ответ, который содержит некорректный запрос. Может использоваться для обнаружения потенциальных угроза безопасности, но требует перекомпиляции glibc с включённой отладкой и параметром RES_DEBUG (только для отладки).
RES_NOALIASES
Отключить использование переменной окружения HOSTALIASES.
RES_USE_INET6
Пытаться выполнить запрос AAAA раньше запроса A внутри функции gethostbyname(), и отобразить ответы IPv4 в «туннелированную форму» IPv6, если записи AAAA не были обнаружены, но есть запись типа A.
RES_ROTATE
Включить циклический выбор среди имеющихся серверов имён. Это приводит к распределению нагрузки среди серверов и использование каждый раз только первого сервера всеми клиентами не происходит.
RES_NOCHECKNAME
Выключить в современном BIND проверку в поступающих именах узлов и почтовых именах недопустимых символов, таких как символы подчёркивания (_), не-ASCII или управляющие символы (пока не реализовано).
RES_KEEPTSIG
Не обрезать записи TSIG (пока не реализовано).
RES_BLAST
Посылать каждый запрос одновременно и рекурсивно всем серверам. Заметим, что это отменяет RES_ROTATE.
RES_USEBSTRING (начиная с glibc 2.3.4)
Выполнять поиск обратной записи IPv6, используя формат значимых битов, описанный в RFC 2673; если этот параметр не задан, то используется полубайтовый формат.
RES_NOIP6DOTINT
Использовать зону ip6.arpa при поиске обратной записи IPv6 вместо ip6.int, которая запрещена начиная с glibc 2.3.4 (по умолчанию включено).
RES_USE_EDNS0 (начиная с glibc 2.6)
Включить поддержку расширений DNS (EDNS0), описанных в RFC 2671.
RES_SNGLKUP (начиная с glibc 2.10)
По умолчанию, glibc начиная с версии 2.9 выполняет поиск по IPv4 и IPv6 параллельно. Некоторые приложения DNS-серверов не могут обработать такие запросы должным образом и делают паузу между ответами на запрос. Этот параметр отключает данное поведение, что заставляет glibc делать запросы IPv6 и IPv4 последовательно (что замедляет процесс определения имени).
RES_SNGLKUPREOP
Открывать для каждого запроса новый сокет, если указано значение RES_SNGLKUP.
RES_USE_DNSSEC
Использовать DNSSEC с битом OK в записи OPT. Это значение подразумевает RES_USE_EDNS0.
RES_NOTLDQUERY
Не искать неполное имя как домен верхнего уровня (TLD).
RES_DEFAULT
Значение по умолчанию подразумевает: RES_RECURSE, RES_DEFNAMES, RES_DNSRCH and RES_NOIP6DOTINT.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном выполнении функции res_ninit() и res_init() возвращают 0, и -1 при ошибке.

Функции res_nquery(), res_query(), res_nsearch(), res_search(), res_nquerydomain(), res_querydomain(), res_nmkquery(), res_mkquery(), res_nsend() и res_send() возвращают длину ответа или -1 при ошибке.

Функции dn_comp() и dn_expand() возвращают длину сжатого имени, или -1 при ошибках.

ФАЙЛЫ

/etc/resolv.conf          файл настройки определителя имён
/etc/host.conf            файл настройки определителя имён

АТРИБУТЫ

Описание терминов данного раздела смотрите в attributes(7).
ИнтерфейсАтрибутЗначение
res_ninit(), res_nquery(),
res_nsearch(), res_nquerydomain(), res_nsend()
безвредность в нитяхбезвредно (MT-Safe locale)
res_nmkquery(), dn_comp(),
dn_expand()
безвредность в нитяхбезвредно (MT-Safe)

СООТВЕТСТВИЕ СТАНДАРТАМ

4.3BSD.