You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
2.9 KiB
67 lines
2.9 KiB
/* |
|
* 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 <ip>") — для юнит-тестов. */ |
|
int adns_parse_resolv_conf(const char* text, struct sockaddr_in* out, int max); |
|
|
|
#ifdef __cplusplus |
|
} |
|
#endif |
|
|
|
#endif /* ASYNC_DNS_H */
|
|
|