class DebugproxySocket
{
public:
- DebugproxySocket(boost::asio::io_service &io);
+ DebugproxySocket(int sock, boost::asio::io_service &io);
+ DebugproxySocket(std::string sock_path, boost::asio::io_service &io);
void start_accept();
void shutdown();
private:
void handle_connection(std::shared_ptr<local_sock> local_sock,
yield_ctx yield);
boost::asio::io_service &io;
- local::stream_protocol::endpoint ep;
local::stream_protocol::acceptor acceptor;
std::shared_ptr<AsyncEvent> quit_event;
};
#include "DebugproxySocket.h"
#include "ProxySession.h"
-DebugproxySocket::DebugproxySocket(boost::asio::io_service &io)
+DebugproxySocket::DebugproxySocket(int sock, boost::asio::io_service &io)
: io(io)
-, ep(DEBUGPROXY_SOCK_PATH)
-, acceptor(io, ep)
+, acceptor(io, local::stream_protocol(), sock)
, quit_event(std::make_shared<AsyncEvent>(io))
{}
+DebugproxySocket::DebugproxySocket(std::string sock_path, boost::asio::io_service &io)
+: io(io)
+, acceptor(io, sock_path)
+, quit_event(std::make_shared<AsyncEvent>(io))
+{}
+
+
void DebugproxySocket::start_accept()
{
- LOGD(MODULE_DEBUGPROXY, "Listening on %s", DEBUGPROXY_SOCK_PATH);
+ LOGD(MODULE_DEBUGPROXY, "Listening on %s",
+ this->acceptor.local_endpoint().path().c_str());
boost::asio::spawn(this->io, boost::bind(&DebugproxySocket::async_accept,
this, _1));
}
+#include <stdexcept>
#include <boost/asio.hpp>
+#include <systemd/sd-daemon.h>
+
+#include <log.h>
+#include <config.h>
#include <DebugproxySocket.h>
+int take_socket_from_systemd() {
+ int n = sd_listen_fds(0);
+ if (n == 0) {
+ LOGD(MODULE_DEBUGPROXY, "No socket from systemd provided");
+ return -1;
+ }
+ if (n != 1)
+ throw std::runtime_error("Unexpected number of systemd sockets received");
+ int fd = SD_LISTEN_FDS_START;
+ int ret = sd_is_socket_unix(fd, SOCK_STREAM, 1, DEBUGPROXY_SOCK_PATH, 0);
+ if (ret <= 0)
+ throw std::runtime_error("Error when checking systemd socket type");
+ return fd;
+}
+
int main()
{
- boost::asio::io_service io;
- DebugproxySocket socket(io);
- socket.start_accept();
-
- boost::asio::signal_set graceful_shutdown_sigs(io, SIGTERM);
- graceful_shutdown_sigs.async_wait(
- [&socket](const boost::system::error_code &e, int number) {
- socket.shutdown();
- });
-
- io.run();
+ try {
+ boost::asio::io_service io;
+ int sock = take_socket_from_systemd();
+ DebugproxySocket socket = sock >= 0 ? DebugproxySocket(sock, io)
+ : DebugproxySocket(DEBUGPROXY_SOCK_PATH, io);
+ socket.start_accept();
+ boost::asio::signal_set graceful_shutdown_sigs(io, SIGTERM);
+ graceful_shutdown_sigs.async_wait(
+ [&socket](const boost::system::error_code &e, int number) {
+ socket.shutdown();
+ });
+ io.run();
+ } catch (std::exception &e) {
+ LOGD(MODULE_DEBUGPROXY, "Setup error: %s", e.what());
+ return 1;
+ }
return 0;
}