WebDNS/server/main.cpp

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;
}