$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
Subject: [boost] possible problem with boost::iostreams::file_descriptor
From: Zachary Turner (divisortheory_at_[hidden])
Date: 2009-06-10 20:49:30
nested file_descriptor implementation class is defined as follows:
    struct impl {
        impl() :
            #ifdef BOOST_IOSTREAMS_WINDOWS
                handle_(reinterpret_cast<handle_type>(-1)),
            #else
                handle_(-1),
            #endif
                flags_(0)
            { }
        impl(handle_type fd, bool close_on_exit)
            : handle_(fd), flags_(0)
        { if (close_on_exit) flags_ |= impl::close_on_exit; }
        ~impl()
        { if (flags_ & close_on_exit) close_impl(*this); }
        enum flags {
            close_on_exit = 1,
            append = 4
        };
        handle_type  handle_;
        int          flags_;
    };
In the second constructor in particular we have this:
        impl(handle_type fd, bool close_on_exit)
            : handle_(fd), flags_(0)
        { if (close_on_exit) flags_ |= impl::close_on_exit; }
I think this should be changed.  Just because close_on_exit is specified to
false does not mean a file is not open.  It just means don't close it if it
is.  I think flags enumeration should be changed to:
        enum flags {
            close_on_exit = 1,
            good = 2,
            append = 4
        };
and constructors / code should be changed accordingly.  Otherwise following
code (Windows) asserts, even though I don't think it should:
bool is_open(HANDLE h) { return h && h!=INVALID_HANDLE_VALUE;}
HANDLE h = ::CreateFile("C:\\autoexec.bat", GENERIC_READ,
FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
boost::iostreams::file_descriptor fd(h, false);
BOOST_ASSERT(fd.is_open() == is_open(h));
Thoughts?