diff options
-rw-r--r-- | Makefile.am | 8 | ||||
-rw-r--r-- | main.cpp | 17 | ||||
-rw-r--r-- | sd_event_loop.cpp | 49 | ||||
-rw-r--r-- | sd_event_loop.hpp | 13 | ||||
-rw-r--r-- | test/Makefile.am | 7 |
5 files changed, 47 insertions, 47 deletions
diff --git a/Makefile.am b/Makefile.am index 352a20c..297aa9c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,3 +1,10 @@ +BOOST_CXX = \ + -DBOOST_ERROR_CODE_HEADER_ONLY \ + -DBOOST_SYSTEM_NO_DEPRECATED \ + -DBOOST_COROUTINES_NO_DEPRECATION_WARNING \ + -DBOOST_ASIO_DISABLE_THREADS \ + -DBOOST_ALL_NO_LIB + sbin_PROGRAMS = \ netipmid @@ -71,6 +78,7 @@ netipmid_LDFLAGS = \ netipmid_CXXFLAGS = \ -flto \ $(SYSTEMD_CFLAGS) \ + $(BOOST_CXX) \ $(libmapper_CFLAGS) \ $(PHOSPHOR_LOGGING_CFLAGS) \ $(PHOSPHOR_DBUS_INTERFACES_CFLAGS) @@ -13,19 +13,20 @@ #include <dirent.h> #include <dlfcn.h> #include <host-ipmid/ipmid-api.h> -#include <systemd/sd-bus.h> #include <systemd/sd-daemon.h> #include <systemd/sd-event.h> #include <unistd.h> #include <iostream> +#include <sdbusplus/asio/connection.hpp> #include <sdbusplus/timer.hpp> #include <tuple> // Tuple of Global Singletons +static auto io = std::make_shared<boost::asio::io_context>(); session::Manager manager; command::Table table; -eventloop::EventLoop loop; +eventloop::EventLoop loop(io); sol::Manager solManager; std::tuple<session::Manager&, command::Table&, eventloop::EventLoop&, @@ -118,9 +119,8 @@ int main() { std::cerr << "Failed to connect to system bus:" << strerror(-rc) << "\n"; - goto finish; + return rc; } - sdbusp = std::make_shared<sdbusplus::bus::bus>(bus); /* Get an sd event handler */ rc = sd_event_default(&events); @@ -129,6 +129,7 @@ int main() std::cerr << "Failure to create sd_event" << strerror(-rc) << "\n"; return EXIT_FAILURE; } + sdbusp = std::make_shared<sdbusplus::asio::connection>(*io, bus); // Register callback to update cache for a GUID change and cache the GUID command::registerGUIDChangeCallback(); @@ -144,11 +145,5 @@ int main() sol::command::registerCommands(); // Start Event Loop - return std::get<eventloop::EventLoop&>(singletonPool) - .startEventLoop(events); - -finish: - sd_event_unref(events); - - return 0; + return std::get<eventloop::EventLoop&>(singletonPool).startEventLoop(); } diff --git a/sd_event_loop.cpp b/sd_event_loop.cpp index aa5224a..c6ad063 100644 --- a/sd_event_loop.cpp +++ b/sd_event_loop.cpp @@ -8,7 +8,9 @@ #include <sys/socket.h> #include <systemd/sd-daemon.h> +#include <boost/asio/io_context.hpp> #include <phosphor-logging/log.hpp> +#include <sdbusplus/asio/sd_event.hpp> namespace eventloop { @@ -170,35 +172,29 @@ static int retryTimerHandler(sd_event_source* s, uint64_t usec, void* userdata) return 0; } -int EventLoop::startEventLoop(sd_event* events) +int EventLoop::startEventLoop() { int fd = -1; int r = 0; int listen_fd; sigset_t ss; sd_event_source* source = nullptr; - auto bus = ipmid_get_sd_bus_connection(); - event = events; - // Attach the bus to sd_event to service user requests - r = sd_bus_attach_event(bus, event, SD_EVENT_PRIORITY_NORMAL); - if (r < 0) - { - goto finish; - } + sdbusplus::asio::sd_event_wrapper sdEvents(*io); + event = sdEvents.get(); if (sigemptyset(&ss) < 0 || sigaddset(&ss, SIGTERM) < 0 || sigaddset(&ss, SIGINT) < 0) { r = -errno; - goto finish; + return EXIT_FAILURE; } /* Block SIGTERM first, so that the event loop can handle it */ if (sigprocmask(SIG_BLOCK, &ss, nullptr) < 0) { r = -errno; - goto finish; + return EXIT_FAILURE; } /* Let's make use of the default handler and "floating" reference features @@ -206,13 +202,13 @@ int EventLoop::startEventLoop(sd_event* events) r = sd_event_add_signal(event, nullptr, SIGTERM, nullptr, nullptr); if (r < 0) { - goto finish; + return EXIT_FAILURE; } r = sd_event_add_signal(event, nullptr, SIGINT, nullptr, nullptr); if (r < 0) { - goto finish; + return EXIT_FAILURE; } // Create our own socket if SysD did not supply one. @@ -224,7 +220,7 @@ int EventLoop::startEventLoop(sd_event* events) else if (listen_fd > 1) { log<level::ERR>("Too many file descriptors received"); - goto finish; + return 1; } else { @@ -233,7 +229,7 @@ int EventLoop::startEventLoop(sd_event* events) { r = -errno; log<level::ERR>("Unable to manually open socket"); - goto finish; + return EXIT_FAILURE; } address.sin_family = AF_INET; @@ -244,35 +240,24 @@ int EventLoop::startEventLoop(sd_event* events) { r = -errno; log<level::ERR>("Unable to bind socket"); - goto finish; + close(fd); + return EXIT_FAILURE; } } r = sd_event_add_io(event, &source, fd, EPOLLIN, udp623Handler, nullptr); if (r < 0) { - goto finish; + close(fd); + return EXIT_FAILURE; } udpIPMI.reset(source); source = nullptr; - r = sd_event_loop(event); - -finish: - - if (fd >= 0) - { - (void)close(fd); - } - - if (r < 0) - { - log<level::ERR>("Event Loop Failure:", - entry("FAILURE=%s", strerror(-r))); - } + io->run(); - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return EXIT_SUCCESS; } void EventLoop::startHostConsole(const sol::CustomFD& fd) diff --git a/sd_event_loop.hpp b/sd_event_loop.hpp index 2faa7ad..5218b27 100644 --- a/sd_event_loop.hpp +++ b/sd_event_loop.hpp @@ -4,6 +4,7 @@ #include <systemd/sd-event.h> +#include <boost/asio/io_context.hpp> #include <chrono> #include <map> @@ -42,7 +43,10 @@ enum class Timers class EventLoop { public: - EventLoop() = default; + explicit EventLoop(std::shared_ptr<boost::asio::io_context> io) : io(io) + { + } + EventLoop() = delete; ~EventLoop() = default; EventLoop(const EventLoop&) = delete; EventLoop& operator=(const EventLoop&) = delete; @@ -67,11 +71,10 @@ class EventLoop /** @brief Initialise the event loop and add the handler for incoming * IPMI packets. - * @param[in] events- sd bus event; * * @return EXIT_SUCCESS on success and EXIT_FAILURE on failure. */ - int startEventLoop(sd_event* events); + int startEventLoop(); /** @brief Add host console I/O event source to the event loop. * @@ -139,6 +142,10 @@ class EventLoop /** @brief Event source object for host console. */ EventSource hostConsole = nullptr; + /** @brief boost::asio io context to run with + */ + std::shared_ptr<boost::asio::io_context> io; + /** @brief Event source for the UDP socket listening on IPMI standard * port. */ diff --git a/test/Makefile.am b/test/Makefile.am index b4996d0..49d96d4 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -1,3 +1,8 @@ +BOOST_CXX = -DBOOST_ERROR_CODE_HEADER_ONLY \ + -DBOOST_SYSTEM_NO_DEPRECATED \ + -DBOOST_COROUTINES_NO_DEPRECATION_WARNING \ + -DBOOST_ALL_NO_LIB + AM_CPPFLAGS = -I$(top_srcdir) # Run all 'check' test programs @@ -6,7 +11,7 @@ TESTS = $(check_PROGRAMS) # # Build/add utest to test suite check_PROGRAMS = utest utest_CPPFLAGS = -Igtest $(GTEST_CPPFLAGS) $(AM_CPPFLAGS) -utest_CXXFLAGS = $(PTHREAD_CFLAGS) +utest_CXXFLAGS = $(PTHREAD_CFLAGS) $(BOOST_CXX) utest_LDFLAGS = -lgtest_main -lgtest $(PTHREAD_LIBS) $(OESDK_TESTCASE_FLAGS) $(CRYPTO_LIBS) utest_SOURCES = cipher.cpp utest_LDADD = \ |