62 lines
1.4 KiB
C++
62 lines
1.4 KiB
C++
|
// SPDX-FileCopyrightText: Matteo Settenvini <matteo.settenvini@montecristosoftware.eu>
|
||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
#include "wrapper.hh"
|
||
|
|
||
|
#include "cares_init.hh"
|
||
|
|
||
|
#include <ares.h>
|
||
|
#include <nss.h>
|
||
|
|
||
|
#include <memory>
|
||
|
#include <string>
|
||
|
#include <vector>
|
||
|
|
||
|
namespace malcontent {
|
||
|
|
||
|
struct ResolverArgs {
|
||
|
const char *name; // in
|
||
|
int family; // in
|
||
|
hostent *result; // out
|
||
|
char *buffer; // out
|
||
|
size_t buflen; // in
|
||
|
int *errnop; // out
|
||
|
HErrno *h_errnop; // out
|
||
|
int32_t *ttlp; // out
|
||
|
};
|
||
|
|
||
|
class Resolver {
|
||
|
public:
|
||
|
Resolver(std::vector<std::string> dns);
|
||
|
|
||
|
auto resolve(ResolverArgs& args) -> nss_status;
|
||
|
|
||
|
private:
|
||
|
struct CAresDeletor {
|
||
|
auto operator() (ares_channel_t *ch) const -> void {
|
||
|
ares_destroy(ch);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
using CAresChannel = std::unique_ptr<ares_channel_t, CAresDeletor>;
|
||
|
|
||
|
static auto resolve_cb(void *arg,
|
||
|
int status,
|
||
|
int timeouts,
|
||
|
unsigned char *abuf,
|
||
|
int alen) -> void;
|
||
|
|
||
|
auto resolved(ResolverArgs& result,
|
||
|
int status,
|
||
|
int timeouts,
|
||
|
unsigned char *abuf,
|
||
|
int alen) -> nss_status;
|
||
|
|
||
|
std::shared_ptr<CAresLibrary> _ensure_cares_initialized;
|
||
|
CAresChannel _channel;
|
||
|
};
|
||
|
|
||
|
} // ~ namespace malcontent
|