$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r79970 - in branches/release/libs/iostreams: src test
From: marshall_at_[hidden]
Date: 2012-08-11 11:07:16
Author: marshall
Date: 2012-08-11 11:07:16 EDT (Sat, 11 Aug 2012)
New Revision: 79970
URL: http://svn.boost.org/trac/boost/changeset/79970
Log:
Merging to release; Fixes #6576
Added:
   branches/release/libs/iostreams/test/windows_pipe_test.cpp   (contents, props changed)
Properties modified: 
   branches/release/libs/iostreams/src/file_descriptor.cpp   (contents, props changed)
   branches/release/libs/iostreams/test/Jamfile.v2   (contents, props changed)
Text files modified: 
   branches/release/libs/iostreams/src/file_descriptor.cpp |    10 +++++++++-                              
   branches/release/libs/iostreams/test/Jamfile.v2         |     3 +++                                     
   2 files changed, 12 insertions(+), 1 deletions(-)
Modified: branches/release/libs/iostreams/src/file_descriptor.cpp
==============================================================================
--- branches/release/libs/iostreams/src/file_descriptor.cpp	(original)
+++ branches/release/libs/iostreams/src/file_descriptor.cpp	2012-08-11 11:07:16 EDT (Sat, 11 Aug 2012)
@@ -263,7 +263,15 @@
 #ifdef BOOST_IOSTREAMS_WINDOWS
     DWORD result;
     if (!::ReadFile(handle_, s, n, &result, NULL))
-        throw_system_failure("failed reading");
+    {
+        // report EOF if the write-side of a pipe has been closed
+        if (GetLastError() == ERROR_BROKEN_PIPE)
+        {
+            result = 0;
+        }
+        else
+            throw_system_failure("failed reading");
+    }
     return result == 0 ? -1 : static_cast<std::streamsize>(result);
 #else // #ifdef BOOST_IOSTREAMS_WINDOWS
     errno = 0;
Modified: branches/release/libs/iostreams/test/Jamfile.v2
==============================================================================
--- branches/release/libs/iostreams/test/Jamfile.v2	(original)
+++ branches/release/libs/iostreams/test/Jamfile.v2	2012-08-11 11:07:16 EDT (Sat, 11 Aug 2012)
@@ -107,6 +107,9 @@
           [ test-iostreams symmetric_filter_test.cpp ]
           [ test-iostreams tee_test.cpp ]
           [ test-iostreams wide_stream_test.cpp ]
+          [ test-iostreams windows_pipe_test.cpp
+               ../build//boost_iostreams
+               : <build>no <target-os>windows:<build>yes ]
           ;  
 
       if $(LARGE_FILE_KEEP) 
Added: branches/release/libs/iostreams/test/windows_pipe_test.cpp
==============================================================================
--- (empty file)
+++ branches/release/libs/iostreams/test/windows_pipe_test.cpp	2012-08-11 11:07:16 EDT (Sat, 11 Aug 2012)
@@ -0,0 +1,63 @@
+// (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com)
+// (C) Copyright 2004-2007 Jonathan Turkanis
+// (C) Copyright 2012 Boris Schaeling
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
+
+// See http://www.boost.org/libs/iostreams for documentation.
+
+#include <Windows.h>
+#include <boost/iostreams/device/file_descriptor.hpp>
+#include <boost/iostreams/filtering_stream.hpp>
+#include <boost/iostreams/get.hpp>
+#include <boost/test/test_tools.hpp>
+#include <boost/test/unit_test.hpp>
+
+using namespace boost::iostreams;
+using boost::unit_test::test_suite;
+
+void read_from_file_descriptor_source_test()
+{
+    HANDLE handles[2];
+    ::CreatePipe(&handles[0], &handles[1], NULL, 0);
+
+    char buffer[2] = { 'a', 'b' };
+    DWORD written;
+    ::WriteFile(handles[1], buffer, 2, &written, NULL);
+    ::CloseHandle(handles[1]);
+
+    file_descriptor_source is(handles[0], close_handle);
+
+    BOOST_CHECK_EQUAL('a', get(is));
+    BOOST_CHECK_EQUAL('b', get(is));
+    BOOST_CHECK_EQUAL(-1, get(is));
+    BOOST_CHECK_EQUAL(-1, get(is));
+}
+
+void read_from_filtering_istream_test()
+{
+    HANDLE handles[2];
+    ::CreatePipe(&handles[0], &handles[1], NULL, 0);
+
+    char buffer[2] = { 'a', 'b' };
+    DWORD written;
+    ::WriteFile(handles[1], buffer, 2, &written, NULL);
+    ::CloseHandle(handles[1]);
+
+    file_descriptor_source source(handles[0], close_handle);
+    filtering_istream is;
+    is.push(source);
+
+    BOOST_CHECK_EQUAL('a', get(is));
+    BOOST_CHECK_EQUAL('b', get(is));
+    BOOST_CHECK_EQUAL(-1, get(is));
+    BOOST_CHECK_EQUAL(-1, get(is));
+}
+
+test_suite* init_unit_test_suite(int, char* [])
+{
+    test_suite* test = BOOST_TEST_SUITE("Windows pipe test");
+    test->add(BOOST_TEST_CASE(&read_from_file_descriptor_source_test));
+    test->add(BOOST_TEST_CASE(&read_from_filtering_istream_test));
+    return test;
+}