aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ttwhy/main.cpp26
-rw-r--r--ttwhy/scoped_attributes.cppm5
2 files changed, 27 insertions, 4 deletions
diff --git a/ttwhy/main.cpp b/ttwhy/main.cpp
index 32324c0..c210bee 100644
--- a/ttwhy/main.cpp
+++ b/ttwhy/main.cpp
@@ -1,15 +1,35 @@
-#include <asio/io_context.hpp>
-
+#include <asio.hpp>
#include <stdio.h>
import ttwhy;
+auto handle_signals(asio::cancellation_signal & cancellation_signal) -> asio::awaitable<void>
+{
+ co_await asio::this_coro::reset_cancellation_state(asio::disable_cancellation());
+ co_await asio::this_coro::throw_if_cancelled(false);
+
+ auto executor = co_await asio::this_coro::executor;
+ auto signals = asio::signal_set{executor, SIGINT, SIGTERM};
+ auto log_stream = asio::posix::stream_descriptor{executor, fileno(stdout)};
+
+ auto [error, signal] = co_await signals.async_wait(asio::as_tuple(asio::use_awaitable));
+
+ if (!error)
+ {
+ co_await asio::async_write(log_stream, asio::buffer("shutting down...\n"), asio::as_tuple(asio::use_awaitable));
+ cancellation_signal.emit(asio::cancellation_type::all);
+ }
+}
+
auto main() -> int
{
auto terminal_attributes = ttwhy::scoped_attributes{fileno(stdin)} //
.canonical_mode(false)
.echo(false);
-
auto context = asio::io_context{};
+ auto cancellation_signal = asio::cancellation_signal{};
+
+ asio::co_spawn(context, handle_signals(cancellation_signal), asio::detached);
+
context.run();
}
diff --git a/ttwhy/scoped_attributes.cppm b/ttwhy/scoped_attributes.cppm
index dd66b54..7c32ddf 100644
--- a/ttwhy/scoped_attributes.cppm
+++ b/ttwhy/scoped_attributes.cppm
@@ -45,7 +45,10 @@ namespace ttwhy
active_attributes.c_lflag = active_attributes.c_lflag & ~flag;
}
- tcsetattr(file_descriptor, TCSANOW, &active_attributes);
+ if (tcsetattr(file_descriptor, TCSANOW, &active_attributes))
+ {
+ throw std::system_error(errno, std::system_category(), "failed to write termios attributes");
+ }
}
//! Store the current TC attributes and restore them on destruction.