diff options
| author | Felix Morgner <felix.morgner@gmail.com> | 2026-06-17 11:17:59 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@gmail.com> | 2026-06-17 17:52:24 +0200 |
| commit | e38520f3493a37d500adbca2704e1837bfdc488f (patch) | |
| tree | c815f9f8d0f29595bc66bf0693b1e053dbb610cd /ttwhy/main.cpp | |
| parent | 6e05501e8786f651fbf871c414c50573e5fecfb8 (diff) | |
| download | ttwhy-e38520f3493a37d500adbca2704e1837bfdc488f.tar.xz ttwhy-e38520f3493a37d500adbca2704e1837bfdc488f.zip | |
app: implement simple echo
Diffstat (limited to 'ttwhy/main.cpp')
| -rw-r--r-- | ttwhy/main.cpp | 28 |
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(); } |
