aboutsummaryrefslogtreecommitdiff
path: root/ttwhy/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ttwhy/main.cpp')
-rw-r--r--ttwhy/main.cpp28
1 files changed, 17 insertions, 11 deletions
diff --git a/ttwhy/main.cpp b/ttwhy/main.cpp
index c210bee..649d01d 100644
--- a/ttwhy/main.cpp
+++ b/ttwhy/main.cpp
@@ -1,23 +1,30 @@
#include <asio.hpp>
+#include <asio/experimental/awaitable_operators.hpp>
+
#include <stdio.h>
+#include <format>
+
import ttwhy;
-auto handle_signals(asio::cancellation_signal & cancellation_signal) -> asio::awaitable<void>
+auto app(int in, int out, int error) -> asio::awaitable<void>
{
- co_await asio::this_coro::reset_cancellation_state(asio::disable_cancellation());
- co_await asio::this_coro::throw_if_cancelled(false);
+ using namespace asio::experimental::awaitable_operators;
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));
+ auto input_stream = asio::posix::stream_descriptor{executor, in};
+ auto output_stream = asio::posix::stream_descriptor{executor, out};
+ auto error_stream = asio::posix::stream_descriptor{executor, error};
+
+ auto result =
+ co_await (ttwhy::io::handle_signals(error_stream) || ttwhy::io::echo(input_stream, output_stream, error_stream));
+ auto final_error = result.index() == 0 ? std::get<0>(result) : std::get<1>(result);
- if (!error)
+ if (final_error && final_error != asio::error::operation_aborted)
{
- 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 message = std::format("Terminated with error: {}\n", final_error.message());
+ co_await asio::async_write(error_stream, asio::buffer(message), asio::use_awaitable);
}
}
@@ -27,9 +34,8 @@ auto main() -> int
.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);
+ asio::co_spawn(context, app(fileno(stdin), fileno(stdout), fileno(stderr)), asio::detached);
context.run();
}