From a4c02357c3975c92881ec51c8fe5b2fd8d2a47f9 Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 26 Jun 2020 16:09:46 -0700 Subject: [PATCH] Pipe streams supported for MacOS too. --- src/tl/tl/tlStream.cc | 27 +++++++++++++++++------ src/tl/unit_tests/tlStreamTests.cc | 17 ++++++++++++++ testdata/net_tracer/t6_all_nets.oas.gz.4 | Bin 0 -> 884 bytes 3 files changed, 37 insertions(+), 7 deletions(-) create mode 100644 testdata/net_tracer/t6_all_nets.oas.gz.4 diff --git a/src/tl/tl/tlStream.cc b/src/tl/tl/tlStream.cc index e6d8d2b6f..193b0fabe 100644 --- a/src/tl/tl/tlStream.cc +++ b/src/tl/tl/tlStream.cc @@ -1106,10 +1106,22 @@ size_t InputPipe::read (char *b, size_t n) { tl_assert (m_file != NULL); - size_t ret = fread (b, 1, n, m_file); - if (ret < n) { - if (ferror (m_file)) { - throw FilePReadErrorException (m_source, ferror (m_file)); + + bool retry = true; + size_t ret = 0; + + while (retry) { + retry = false; + ret = fread (b, 1, n, m_file); + if (ret < n) { + if (ferror (m_file)) { + if (errno != EINTR) { + throw FilePReadErrorException (m_source, errno); + } else if (ret == 0) { + retry = true; + clearerr (m_file); + } + } } } @@ -1138,7 +1150,7 @@ OutputPipe::OutputPipe (const std::string &path) OutputPipe::~OutputPipe () { if (m_file != NULL) { - fclose (m_file); + pclose (m_file); m_file = NULL; } } @@ -1147,10 +1159,11 @@ void OutputPipe::write (const char *b, size_t n) { tl_assert (m_file != NULL); + size_t ret = fwrite (b, 1, n, m_file); if (ret < n) { - if (ferror (m_file)) { - throw FilePWriteErrorException (m_source, ferror (m_file)); + if (ferror (m_file) && errno != EINTR) { + throw FilePReadErrorException (m_source, errno); } } } diff --git a/src/tl/unit_tests/tlStreamTests.cc b/src/tl/unit_tests/tlStreamTests.cc index 733db501d..f2fb84218 100644 --- a/src/tl/unit_tests/tlStreamTests.cc +++ b/src/tl/unit_tests/tlStreamTests.cc @@ -52,6 +52,23 @@ TEST(InputPipe2) EXPECT_NE (ret, 0); } +TEST(OutputPipe1) +{ + std::string tf = tmp_file ("pipe_out"); + + { + tl::OutputPipe pipe ("cat >" + tf); + tl::OutputStream str (pipe); + str << "Hello, world!"; + } + + { + tl::InputStream is (tf); + std::string s = is.read_all (); + EXPECT_EQ (s, "Hello, world!"); + } +} + TEST(TextOutputStream) { std::string fn = tmp_file ("test.txt"); diff --git a/testdata/net_tracer/t6_all_nets.oas.gz.4 b/testdata/net_tracer/t6_all_nets.oas.gz.4 new file mode 100644 index 0000000000000000000000000000000000000000..e94e268a57e22e47ad4130a79a90cf7f52849d30 GIT binary patch literal 884 zcmd^*O=}ZD7{}+CnVn=`rr9ZzC^aBRg@7;E7DOsS-^ zg~^0tJ6r=Ybny~u1kmw_h6fyXB5~7o?6H(J>e{KaHD*n_H|){$^&pM%Xa~=v{w0Wp zHOEa)PPs{IeB7WZEA5cZ3kd?(2=glL;1E%h_H=T_PP>U-+ND=?JUBuc0fLNf!WCJ- z=n+)lnObKuSAi$+MqN_m2ZA32Psm&os_d>-Vlv+d%)y4TtUeCOToG!ppng?26)mL> zd#cD*SX+}HF@FznPx65Z1O|Le~e};l3M(+_U3ku5oQ1UNFWcF<+GbOW`4W)Kk-toJ} z%2yAB9?)L1;B&^_tG>w>Bi8$Tz5?q)XMPipp7g+uu}BVmZZs3st-c_9i8VQ yeJLBH}mrOX^fxCivL2qR9{vZ8+SG9?jKV56}M3fzTg