summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile.am8
-rw-r--r--main.cpp17
-rw-r--r--sd_event_loop.cpp49
-rw-r--r--sd_event_loop.hpp13
-rw-r--r--test/Makefile.am7
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)
diff --git a/main.cpp b/main.cpp
index b142ed7..c3f3dfd 100644
--- a/main.cpp
+++ b/main.cpp
@@ -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 = \
OpenPOWER on IntegriCloud