|
1 | 1 | #include "net/proxy/system/stdio-stream.h"
|
2 | 2 |
|
3 | 3 | #include "absl/container/fixed_array.h"
|
| 4 | +#ifdef _WIN32 |
| 5 | +#include "io/file-utils.h" |
| 6 | +#endif |
4 | 7 |
|
5 | 8 | namespace net {
|
6 | 9 | namespace proxy {
|
7 | 10 | namespace system {
|
8 | 11 |
|
9 | 12 | StdioStream::StdioStream(const any_io_executor &executor)
|
10 |
| - : stdin_(executor, STDIN_FILENO), |
11 |
| - stdout_(executor, STDOUT_FILENO) {} |
| 13 | + : executor_(executor), |
| 14 | +#ifndef _WIN32 |
| 15 | + stdin_(executor, STDIN_FILENO), |
| 16 | + stdout_(executor, STDOUT_FILENO) |
| 17 | +#else |
| 18 | + stdin_thread_(1), |
| 19 | + stdout_thread_(1), |
| 20 | + stdin_(io::std_input()), |
| 21 | + stdout_(io::std_output()) |
| 22 | +#endif |
| 23 | + {} |
12 | 24 |
|
13 | 25 | void StdioStream::async_read_some(
|
14 | 26 | absl::Span<mutable_buffer const> buffers,
|
15 | 27 | absl::AnyInvocable<void(std::error_code, size_t) &&> callback) {
|
| 28 | +#ifndef _WIN32 |
16 | 29 | stdin_.async_read_some(
|
17 | 30 | absl::FixedArray<mutable_buffer, 1>(buffers.begin(), buffers.end()),
|
18 | 31 | std::move(callback));
|
| 32 | +#else |
| 33 | + post( |
| 34 | + stdin_thread_, |
| 35 | + [this, buffers, callback = std::move(callback)]() mutable { |
| 36 | + if (buffers.empty()) { |
| 37 | + std::move(callback)({}, 0); |
| 38 | + return; |
| 39 | + } |
| 40 | + size_t size; |
| 41 | + std::error_code ec = stdin_.read( |
| 42 | + {buffers.front().data(), buffers.front().size()}, size); |
| 43 | + if (ec) { |
| 44 | + std::move(callback)(ec, 0); |
| 45 | + return; |
| 46 | + } |
| 47 | + std::move(callback)({}, size); |
| 48 | + }); |
| 49 | +#endif |
19 | 50 | }
|
20 | 51 |
|
21 | 52 | void StdioStream::async_write_some(
|
22 | 53 | absl::Span<const_buffer const> buffers,
|
23 | 54 | absl::AnyInvocable<void(std::error_code, size_t) &&> callback) {
|
| 55 | +#ifndef _WIN32 |
24 | 56 | stdout_.async_write_some(
|
25 | 57 | absl::FixedArray<const_buffer, 1>(buffers.begin(), buffers.end()),
|
26 | 58 | std::move(callback));
|
| 59 | +#else |
| 60 | + post( |
| 61 | + stdout_thread_, |
| 62 | + [this, buffers, callback = std::move(callback)]() mutable { |
| 63 | + size_t size = 0; |
| 64 | + for (const_buffer buffer : buffers) { |
| 65 | + std::error_code ec = io::write( |
| 66 | + stdout_, {buffer.data(), buffer.size()}); |
| 67 | + if (ec) { |
| 68 | + std::move(callback)(ec, size); |
| 69 | + return; |
| 70 | + } |
| 71 | + size += buffer.size(); |
| 72 | + } |
| 73 | + std::move(callback)({}, size); |
| 74 | + }); |
| 75 | +#endif |
27 | 76 | }
|
28 | 77 |
|
29 | 78 | void StdioStream::close() {
|
| 79 | +#ifndef _WIN32 |
30 | 80 | boost::system::error_code ec;
|
31 | 81 | stdin_.close(ec);
|
32 | 82 | stdout_.close(ec);
|
| 83 | +#endif |
33 | 84 | }
|
34 | 85 |
|
35 | 86 | } // namespace system
|
|
0 commit comments