Take local debugproxy socket from systemd 89/185689/2
authorIgor Kotrasinski <i.kotrasinsk@partner.samsung.com>
Fri, 20 Jul 2018 13:49:46 +0000 (15:49 +0200)
committerIgor Kotrasinski <i.kotrasinsk@partner.samsung.com>
Tue, 21 Aug 2018 10:37:29 +0000 (12:37 +0200)
Change-Id: I468c80dcecd977afd762f103a27cedd00cec7621
Signed-off-by: Igor Kotrasinski <i.kotrasinsk@partner.samsung.com>
simulatordaemon/debugproxy/CMakeLists.txt
simulatordaemon/debugproxy/inc/DebugproxySocket.h
simulatordaemon/debugproxy/src/DebugproxySocket.cpp
simulatordaemon/debugproxy/src/main.cpp

index b55eaaf..8197799 100644 (file)
@@ -19,6 +19,7 @@
 
 PKG_CHECK_MODULES(DEBUGPROXY_DEPS REQUIRED
     dlog
+    libsystemd-daemon
 )
 
 SET(DEBUGPROXY_SOURCES
index d07d4a4..316f239 100644 (file)
@@ -11,7 +11,8 @@
 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:
@@ -19,7 +20,6 @@ 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;
 };
index fa586fb..130eb50 100644 (file)
 #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));
 }
index 8febefc..3b92ad6 100644 (file)
@@ -1,18 +1,43 @@
+#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;
 }