aboutsummaryrefslogtreecommitdiff
path: root/ttwhy/io/signal_handling.cppm
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@gmail.com>2026-09-22 17:54:25 +0200
committerFelix Morgner <felix.morgner@gmail.com>2026-09-22 17:54:25 +0200
commit1212a302b500c37420613086a1b85f0659f09d57 (patch)
tree76ef77e7f64c6278f7fd6e6148cc4aae1585eef7 /ttwhy/io/signal_handling.cppm
parenta63e7d65293c07e0567cfdafbce693a543bf2a0d (diff)
downloadttwhy-1212a302b500c37420613086a1b85f0659f09d57.tar.xz
ttwhy-1212a302b500c37420613086a1b85f0659f09d57.zip
lib/io: refactor I/O module
Diffstat (limited to 'ttwhy/io/signal_handling.cppm')
-rw-r--r--ttwhy/io/signal_handling.cppm58
1 files changed, 58 insertions, 0 deletions
diff --git a/ttwhy/io/signal_handling.cppm b/ttwhy/io/signal_handling.cppm
new file mode 100644
index 0000000..1f3fecc
--- /dev/null
+++ b/ttwhy/io/signal_handling.cppm
@@ -0,0 +1,58 @@
+module;
+
+#include <asio.hpp>
+
+#include <csignal>
+#include <format>
+#include <system_error>
+
+export module ttwhy.io:signal_handling;
+
+namespace ttwhy::io
+{
+
+ export template<typename Stream, typename TerminalAttributes>
+ auto handle_signals(Stream & stream, TerminalAttributes & attributes) -> asio::awaitable<std::error_code>
+ {
+ auto executor = co_await asio::this_coro::executor;
+ auto signals = asio::signal_set{executor, SIGINT, SIGTERM};
+ signals.add(SIGTSTP);
+ signals.add(SIGCONT);
+
+ while (true)
+ {
+ auto [error, signal] = co_await signals.async_wait(asio::as_tuple(asio::use_awaitable));
+ if (error)
+ {
+ co_return error;
+ }
+
+ switch (signal)
+ {
+ case SIGINT:
+ case SIGTERM:
+ {
+ auto message = std::format("Received signal {}, exiting ...\n", signal);
+ co_await asio::async_write(stream, asio::buffer(message), asio::use_awaitable);
+ co_return asio::error_code{};
+ }
+ case SIGTSTP:
+ {
+ attributes.canonical_mode(true).echo(true);
+ ::raise(SIGSTOP);
+ break;
+ }
+ case SIGCONT:
+ {
+ attributes.canonical_mode(false).echo(false);
+ break;
+ }
+ }
+
+ if (!error)
+ {
+ }
+ }
+ }
+
+} // namespace ttwhy::io