/* * async_dns.h — асинхронный (неблокирующий) DNS-резолвер поверх uasync. * * Тонкий адаптер над libdns (lib/dns.c, MIT). Выполняет A-запросы без * блокировки event loop: резолвер libdns управляется через uasync-сокеты и * таймеры (интерфейс pollfd/events/timeout + submit/check/fetch). * * Поддерживает только A-записи (IPv4) — этого достаточно для NTP и текущего * стека. TCP-fallback при truncation и компрессия имён — внутри libdns. */ #ifndef ASYNC_DNS_H #define ASYNC_DNS_H #include "u_async.h" #include "socket_compat.h" #ifdef __cplusplus extern "C" { #endif #define ADNS_OK 0 #define ADNS_ERR_NOMEM -1 #define ADNS_ERR_PARAM -2 #define ADNS_ERR_NOSERV -3 /* нет ни одного DNS-сервера */ #define ADNS_ERR_NODATA -4 /* NXDOMAIN или нет A-записей */ #define ADNS_ERR_TIMEOUT -5 #define ADNS_ERR_RESPONSE -6 /* malformed / SERVFAIL / прочая ошибка ответа */ #define ADNS_MAX_ADDRS 8 struct adns_result { int status; int count; struct sockaddr_in addrs[ADNS_MAX_ADDRS]; /* AF_INET, sin_port = 0 */ }; typedef void (*adns_done_cb)(const struct adns_result* res, void* arg); struct adns_opts { struct sockaddr_in server; /* sin_family != 0 → использовать этот сервер (иначе системные) */ int timeout_ms; /* таймаут на сервер, по умолчанию 2000 */ int max_attempts; /* попыток на сервер, по умолчанию 2 */ }; struct adns_query; /* opaque */ /* Запускает асинхронный A-запрос. Коллбэк вызывается в потоке event loop. Возвращает handle (NULL при немедленной ошибке: невалидные аргументы/нет памяти). */ struct adns_query* adns_resolve(struct UASYNC* ua, const char* name, const struct adns_opts* opts, adns_done_cb cb, void* arg); /* Отмена ожидающего запроса: коллбэк НЕ вызывается. Только из потока loop. */ void adns_cancel(struct adns_query* q); /* Системные DNS-серверы (IPv4). Возвращает количество; out[].sin_port = htons(53). Локальное чтение (resolv.conf / GetNetworkParams), без сети. */ int adns_system_servers(struct sockaddr_in* out, int max); /* Чистый парсер текста resolv.conf ("nameserver ") — для юнит-тестов. */ int adns_parse_resolv_conf(const char* text, struct sockaddr_in* out, int max); #ifdef __cplusplus } #endif #endif /* ASYNC_DNS_H */