boost::iostreams::copy - sink - ENOSPC (No space left on device) error handling

Platform: GCC on Linux; boost 1.55. In the code fragment below, is there a way to handle ENOSPC? #include <fstream> #include <iostream> #include <boost/iostreams/filtering_streambuf.hpp> #include <boost/iostreams/copy.hpp> #include <boost/iostreams/filter/bzip2.hpp> // open input file stream of the bzip2 file std::ifstream ifs("file.bz2"); // open output stream to the "full" device // full device is a "utility-device" to check how applications handle ENOSPC // more details in "man full" std::ofstream ofs("/dev/full"); // Setup the iostreams filter boost::iostreams::filtering_streambuf<boost::iostreams::output> filters; filters.push(boost::iostreams::bzip2_decompressor()); filters.push(ofs); // "run" the filter boost::iostreams::copy(ifs, filters); If I do strace of the compiled binary, the code seem to infinitely call writev() with the same data and returns ENOSPC error. writev(4, [{NULL, 0}, {"DATA DATA "..., 4096}], 2) = -1 ENOSPC (No space left on device) How can this error be handled or made thrown as an error from boost::iostreams::copy() Is it possible to set appropriate exceptions() on the ofstream object? I tried ofs.exceptions(std::ios::badbit | std::ios::failbit) but it didn't make any difference.

Please someone log a bug for this; I tried and couldn't get the Trac system to think that my submission was not a spam. It offered me a page that mentioned something about CAPTCHA, but without the CAPTCHA input! Much appreciate your help! On 6 December 2013 10:43, Dino Korah <dckorah+boost-users@gmail.com> wrote:
Platform: GCC on Linux; boost 1.55.
In the code fragment below, is there a way to handle ENOSPC?
#include <fstream> #include <iostream> #include <boost/iostreams/filtering_streambuf.hpp> #include <boost/iostreams/copy.hpp> #include <boost/iostreams/filter/bzip2.hpp>
// open input file stream of the bzip2 file std::ifstream ifs("file.bz2");
// open output stream to the "full" device // full device is a "utility-device" to check how applications handle ENOSPC // more details in "man full" std::ofstream ofs("/dev/full");
// Setup the iostreams filter boost::iostreams::filtering_streambuf<boost::iostreams::output> filters; filters.push(boost::iostreams::bzip2_decompressor()); filters.push(ofs);
// "run" the filter boost::iostreams::copy(ifs, filters);
If I do strace of the compiled binary, the code seem to infinitely call writev() with the same data and returns ENOSPC error.
writev(4, [{NULL, 0}, {"DATA DATA "..., 4096}], 2) = -1 ENOSPC (No space left on device)
How can this error be handled or made thrown as an error from boost::iostreams::copy()
Is it possible to set appropriate exceptions() on the ofstream object? I tried ofs.exceptions(std::ios::badbit | std::ios::failbit) but it didn't make any difference.
participants (2)
-
Dino Korah
-
DK