aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2024-09-04 13:38:49 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2024-09-04 13:38:49 +0300
commitdf19364adef814237b8afd156d3bd1a33d16b318 (patch)
tree87c0225594052e0246e2e5527225fd8f4a320fee
parent228668db1e44fbe6e9eae6b9fdc193d14bf26c46 (diff)
Turn standard streams into blocking mode on start (GH issue 417)
-rw-r--r--bdep/bdep.cxx19
1 files changed, 19 insertions, 0 deletions
diff --git a/bdep/bdep.cxx b/bdep/bdep.cxx
index 02912d0..cc9ac17 100644
--- a/bdep/bdep.cxx
+++ b/bdep/bdep.cxx
@@ -12,6 +12,7 @@
#include <exception> // set_terminate(), terminate_handler
#include <type_traits> // enable_if, is_base_of
+#include <libbutl/fdstream.hxx> // std*_fdmode()
#include <libbutl/backtrace.hxx> // backtrace()
#include <bdep/types.hxx>
@@ -408,6 +409,24 @@ try
default_terminate = set_terminate (custom_terminate);
+ // Note that the standard stream descriptors can potentially be in the
+ // non-blocking mode, which the C++ streams are not suited for and which are
+ // not fully supported by butl::iofdstreams. Using such descriptors may lead
+ // to various weird failures (see GH issue #417 for the reproducer). Thus,
+ // we just turn such descriptors into the blocking mode at the beginning of
+ // the program execution.
+ //
+ try
+ {
+ stdin_fdmode (fdstream_mode::blocking);
+ stdout_fdmode (fdstream_mode::blocking);
+ stderr_fdmode (fdstream_mode::blocking);
+ }
+ catch (const io_error& e)
+ {
+ fail << "unable to turn standard streams into blocking mode: " << e;
+ }
+
if (fdterm (stderr_fd ()))
{
stderr_term = std::getenv ("TERM");