aboutsummaryrefslogtreecommitdiff
path: root/butl/fdstream
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2017-04-10 13:18:48 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2017-04-10 13:18:48 +0200
commit0703f7a1acc9bf9512fdcad43a18a17981c8ca9e (patch)
tree06d7f888cd701c53b2c2aa0a2c6a11880ac596dd /butl/fdstream
parentd53c8a6ce3d868da66d97a9243365e88d0879343 (diff)
Add fdstream::release()
Diffstat (limited to 'butl/fdstream')
-rw-r--r--butl/fdstream12
1 files changed, 11 insertions, 1 deletions
diff --git a/butl/fdstream b/butl/fdstream
index 6697dd9..cd08b13 100644
--- a/butl/fdstream
+++ b/butl/fdstream
@@ -101,8 +101,16 @@ namespace butl
fdbuf () = default;
fdbuf (auto_fd&&);
+ // Before we invented auto_fd into fdstreams we keept fdbuf opened on
+ // faulty close attempt. Now fdbuf is always closed by close() function.
+ // This semantics change seems to be the right one as there is no reason to
+ // expect fdclose() to succeed after it has already failed once.
+ //
void
- close ();
+ close () {fd_.close ();}
+
+ auto_fd
+ release () {return std::move (fd_);}
void
open (auto_fd&&);
@@ -372,6 +380,7 @@ namespace butl
open (auto_fd&& fd) {buf_.open (std::move (fd)); clear ();}
void close ();
+ auto_fd release () {return buf_.release ();} // Note: no skipping.
bool is_open () const {return buf_.is_open ();}
private:
@@ -449,6 +458,7 @@ namespace butl
open (auto_fd&& fd) {buf_.open (std::move (fd)); clear ();}
void close () {if (is_open ()) flush (); buf_.close ();}
+ auto_fd release () {if (is_open ()) flush (); return buf_.release ();}
bool is_open () const {return buf_.is_open ();}
};