table of contents
RESOLVER(3) | Руководство программиста Linux | RESOLVER(3) |
ИМЯ¶
res_ninit, res_nquery, res_nsearch, res_nquerydomain, res_nmkquery, res_nsend, res_init, res_query, res_search, res_querydomain, res_mkquery, res_send, dn_comp, dn_expand - resolver routines
СИНТАКСИС¶
#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);
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 указывается в третьем аргументе, что позволяет использовать отдельное состояние определителя в каждой нити.
The res_ninit() and res_init() functions read the configuration files (see resolv.conf(5)) to get the default domain name and name server address(es). If no server is given, the local host is tried. If no domain is given, that associated with the local host is used. It can be overridden with the environment variable LOCALDOMAIN. res_ninit() or res_init() is normally executed by the first call to one of the other functions.
Функции 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
- Стандартный запрос.
- IQUERY
- Обратный запрос. Это значение было удалено в glibc 2.26, так как давно не поддерживалось серверами DNS.
- NS_NOTIFY_OP
- Уведомить об изменении SOA (Start of Authority) вторичный сервер.
Параметр 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 (не реализован; устарел в glibc 2.25)
- Принимать только достоверные ответы. Функция res_send() продолжает работать, пока не найдёт достоверный ответ или возвращает ошибку. Данный параметр имелся, но не был реализован в glibc до версии 2.24; начиная с glibc 2.25 он устарел и его при его использовании выдаётся предупреждение.
- RES_USEVC
- использовать TCP-соединение для запросов вместо датаграмм UDP.
- RES_PRIMARY (не реализован; устарел в glibc 2.25)
- Запрашивать только первичный сервер имён. Данный параметр имелся, но не был реализован в glibc до версии 2.24; начиная с glibc 2.25 он устарел и его при его использовании выдаётся предупреждение.
- 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(3), и отображать ответы IPv4 в «туннелированной форме» IPv6, если записи AAAA не были обнаружены, но есть запись типа A. Начиная с glibc 2.25 этот параметр считается устаревшим и при его использовании выдаётся предупреждение; приложения должны использовать getaddrinfo(3), а не gethostbyname(3).
- RES_ROTATE
- Включить циклический выбор среди имеющихся серверов имён. Это приводит к распределению нагрузки среди серверов и использование каждый раз только первого сервера всеми клиентами не происходит.
- RES_NOCHECKNAME (не реализован; устарел в glibc 2.25)
- Выключить в современном BIND проверку недопустимых символов в поступающих именах узлов и почтовых именах, таких как символы подчёркивания (_), не-ASCII или управляющие символы. Данный параметр имелся в glibc до версии 2.24; начиная с glibc 2.25 он устарел и его при его использовании выдаётся предупреждение.
- RES_KEEPTSIG (не реализован; устарел в glibc 2.25)
- Не обрезать записи TSIG. Данный параметр имелся, но не был реализован в glibc до версии 2.24; начиная с glibc 2.25 он устарел и его при его использовании выдаётся предупреждение.
- RES_BLAST (не реализован; устарел в glibc 2.25)
- Посылать каждый запрос одновременно и рекурсивно всем серверам. Данный параметр имелся, но не был реализован в glibc до версии 2.24; начиная с glibc 2.25 он устарел и его при его использовании выдаётся предупреждение.
- RES_USEBSTRING (glibc 2.3.4 по 2.24)
- Выполнить поиск обратной записи IPv6 с помощью формата значимых битов, описанного в RFC 2673; если этот параметр не задан (по умолчанию), то используется полубайтовый формат. Данный параметр был удалён в glibc 2.25, так как он полагается на обратно несовместимое расширение DNS, которое никогда не разворачивалось в Интернете.
- RES_NOIP6DOTINT (glibc 2.24 и старее)
- Использовать зону ip6.arpa при поиске обратной записи IPv6 вместо ip6.int, которая устарела начиная с glibc 2.3.4. Данный параметр существует в glibc по версию 2.24 включительно (и включён по умолчанию). Из glibc 2.25 этот параметр был удалён.
- 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.
СМ. ТАКЖЕ¶
gethostbyname(3), resolv.conf(5), resolver(5), hostname(7), named(8)
Файл resolv/README из библиотеки GNU C.
ЗАМЕЧАНИЯ¶
Эта страница является частью проекта Linux man-pages версии 4.16. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу https://www.kernel.org/doc/man-pages/.
ПЕРЕВОД¶
Русский перевод этой страницы руководства был сделан aereiae <aereiae@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy S. Seregin <dseregin@59.ru>, Katrin Kutepova <blackkatelv@gmail.com>, Lockal <lockalsash@gmail.com>, Yuri Kozlov <yuray@komyakino.ru>, Баринов Владимир и Иван Павлов <pavia00@gmail.com>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.
15 сентября 2017 г. | GNU |