Opened 9 years ago

Last modified 9 years ago

#9478 new Bugs

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

Reported by: dckorah@… Owned by: Jonathan Turkanis
Milestone: To Be Determined Component: iostreams
Version: Boost 1.55.0 Severity: Problem
Keywords: Cc:

Description

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.

Attachments (1)

test.cpp (323 bytes ) - added by bugs@… 9 years ago.
more minimal reproducer

Download all attachments as: .zip

Change History (3)

comment:1 by dckorah@…, 9 years ago

Sorry to log this again; previous attempts were spoilt by the captcha+https issues. got the categorisation and components wrong.

comment:2 by dckorah@…, 9 years ago

Please see more analysis here http://stackoverflow.com/q/20414577/83005

by bugs@…, 9 years ago

Attachment: test.cpp added

more minimal reproducer

Note: See TracTickets for help on using tickets.