table of contents
- bullseye-backports 4.17.0-2~bpo11+1
RESOLVER(3) | Руководство программиста Linux | RESOLVER(3) |
ИМЯ¶
res_ninit, res_nclose, 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 - процедуры определителя имён
СИНТАКСИС¶
#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, 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_nclose() для освобождения памяти, выделенной res_ninit() и последующими вызовами res_nquery().
Функции 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.
The following functions are lower-level routines used by 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 (unimplemented; deprecated in 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
- Default option which implies: 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 при ошибках.
В случае завершения res_nquery(), res_query(), res_nsearch(), res_search(), res_nquerydomain() или res_querydomain() с ошибкой, по глобальной переменной h_errno (смотрите gethostbyname(3)) можно определить причину.
ФАЙЛЫ¶
- /etc/resolv.conf
- файл с настройками резолвера
- /etc/host.conf
- файл с настройками резолвера
АТРИБУТЫ¶
Описание терминов данного раздела смотрите в attributes(7).
Интерфейс | Атрибут | Значение |
res_ninit(), res_nclose(), 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 версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу 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.
21 декабря 2020 г. | GNU |