66 lines
1.4 KiB
C++
66 lines
1.4 KiB
C++
#include <iostream>
|
|
#include <cstring>
|
|
#include <event2/thread.h>
|
|
#include "src/server.h"
|
|
#include "src/handler.h"
|
|
|
|
using namespace ts::dns;
|
|
|
|
std::vector<sockaddr_storage> bindings(uint16_t port) {
|
|
std::vector<sockaddr_storage> result{};
|
|
|
|
{
|
|
sockaddr_in& any_v4{reinterpret_cast<sockaddr_in&>(result.emplace_back())};
|
|
memset(&any_v4, 0, sizeof(sockaddr_in));
|
|
|
|
any_v4.sin_family = AF_INET;
|
|
any_v4.sin_port = htons(port); //htons(53);
|
|
any_v4.sin_addr.s_addr = (1UL << 24U) | 127U;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
__asm__(".symver getrandom,getrandom@GLIBC_2.2.5");
|
|
int main(int argc, char** argv) {
|
|
evthread_use_pthreads();
|
|
|
|
if(argc < 2) {
|
|
std::cerr << "Missing port. Default DNS port is 53\n";
|
|
return 1;
|
|
}
|
|
|
|
uint16_t port{0};
|
|
try {
|
|
port = std::stoul(argv[1]);
|
|
} catch(std::exception& ex) {
|
|
std::cerr << "Failed to parse port\n";
|
|
return 1;
|
|
}
|
|
std::string error{};
|
|
|
|
auto handler = std::make_shared<WebDNSHandler>();
|
|
DNSServer server{handler};
|
|
|
|
if(!server.start(bindings(port), error)) {
|
|
for(auto& binding : server.bindings())
|
|
std::cout << " - " << binding->error << "\n";
|
|
std::cerr << "Failed to start server: " << error << "\n";
|
|
return 1;
|
|
}
|
|
|
|
std::string line;
|
|
while(true) {
|
|
std::getline(std::cin, line);
|
|
if(line.empty())
|
|
continue;
|
|
|
|
if(line == "end" || line == "stop") {
|
|
std::cout << "Stopping server\n";
|
|
break;
|
|
} else {
|
|
std::cerr << "Unknown command \"" << line << "\"\n";
|
|
}
|
|
}
|
|
return 0;
|
|
} |