diff options
| author | Felix Morgner <felix.morgner@gmail.com> | 2026-09-22 17:54:25 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@gmail.com> | 2026-09-22 17:54:25 +0200 |
| commit | 1212a302b500c37420613086a1b85f0659f09d57 (patch) | |
| tree | 76ef77e7f64c6278f7fd6e6148cc4aae1585eef7 /ttwhy/io/signal_handling.cppm | |
| parent | a63e7d65293c07e0567cfdafbce693a543bf2a0d (diff) | |
| download | ttwhy-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.cppm | 58 |
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 |
