#include "server.h"
#include "radproto/packet_codes.h"
+#include "stg/common.h"
+#include <cstring>
#include <functional>
-#include <iostream>
using STG::Server;
using boost::system::error_code;
-Server::Server(boost::asio::io_service& io_service, const std::string& secret, uint16_t port, const std::string& filePath)
+Server::Server(boost::asio::io_service& io_service, const std::string& secret, uint16_t port, const std::string& filePath, std::stop_token token, PluginLogger& logger)
: m_radius(io_service, secret, port),
- m_dictionaries(filePath)
+ m_dictionaries(filePath),
+ m_token(std::move(token)),
+ m_logger(logger)
+{
+ start();
+}
+
+void Server::start()
{
startReceive();
}
+void Server::stop()
+{
+ error_code ec;
+ m_radius.close(ec);
+}
+
void Server::startReceive()
{
m_radius.asyncReceive([this](const auto& error, const auto& packet, const boost::asio::ip::udp::endpoint& source){ handleReceive(error, packet, source); });
void Server::handleSend(const error_code& ec)
{
- if (ec)
- std::cout << "Error asyncSend: " << ec.message() << "\n";
+ if (m_token.stop_requested())
+ return;
+ if (ec)
+ {
+ m_logger("Error asyncSend: %s", ec.message().c_str());
+ printfd(__FILE__, "Error asyncSend: '%s'\n", ec.message().c_str());
+ }
startReceive();
}
void Server::handleReceive(const error_code& error, const std::optional<RadProto::Packet>& packet, const boost::asio::ip::udp::endpoint& source)
{
+ if (m_token.stop_requested())
+ return;
+
if (error)
{
- std::cout << "Error asyncReceive: " << error.message() << "\n";
- return;
+ m_logger("Error asyncReceive: %s", error.message().c_str());
+ printfd(__FILE__, "Error asyncReceive: '%s'\n", error.message().c_str());
}
if (packet == std::nullopt)
{
- std::cout << "Error asyncReceive: the request packet is missing\n";
+ m_logger("Error asyncReceive: the request packet is missing\n");
+ printfd(__FILE__, "Error asyncReceive: the request packet is missing\n");
return;
}
- else
- {
- m_radius.asyncSend(makeResponse(*packet), source, [this](const auto& ec){ handleSend(ec); });
- }
+ m_radius.asyncSend(makeResponse(*packet), source, [this](const auto& ec){ handleSend(ec); });
}