aboutsummaryrefslogtreecommitdiff
path: root/butl/fdstream.cxx
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2016-11-08 15:23:13 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2016-11-08 15:23:13 +0300
commitce9d743824be796471bae9b57c0185ef8ec1b804 (patch)
treefb2b9c476b6fe48639f794f5ec857e8eb890c145 /butl/fdstream.cxx
parentb3473af950434305614bdf031fb408eaef06c1d5 (diff)
Add auto_fd::close()
Diffstat (limited to 'butl/fdstream.cxx')
-rw-r--r--butl/fdstream.cxx23
1 files changed, 21 insertions, 2 deletions
diff --git a/butl/fdstream.cxx b/butl/fdstream.cxx
index dbd7767..102ad66 100644
--- a/butl/fdstream.cxx
+++ b/butl/fdstream.cxx
@@ -68,6 +68,26 @@ namespace butl
ec, m);
}
+ // auto_fd
+ //
+ void auto_fd::
+ close ()
+ {
+ if (fd_ >= 0)
+ {
+ bool r (fdclose (fd_));
+
+ // If fdclose() failed then no reason to expect it to succeed the next
+ // time.
+ //
+ fd_ = -1;
+
+ if (!r)
+ throw_ios_failure (errno);
+ }
+ }
+
+
// fdbuf
//
fdbuf::
@@ -105,8 +125,7 @@ namespace butl
// 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.
//
- if (is_open () && !fdclose (fd_.release ()))
- throw_ios_failure (errno);
+ fd_.close ();
}
streamsize fdbuf::