From cf6b3e34b59ad120111e0c1ead779bbb3a70c38d Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 12 Mar 2015 15:43:17 +0200 Subject: Implement clean operation --- build/filesystem.cxx | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 build/filesystem.cxx (limited to 'build/filesystem.cxx') diff --git a/build/filesystem.cxx b/build/filesystem.cxx new file mode 100644 index 0000000..75d0283 --- /dev/null +++ b/build/filesystem.cxx @@ -0,0 +1,56 @@ +// file : build/filesystem.cxx -*- C++ -*- +// copyright : Copyright (c) 2014-2015 Code Synthesis Tools CC +// license : MIT; see accompanying LICENSE file + +#include + +#include // rmdir(), unlink() +#include // mkdir() + +#include + +using namespace std; + +namespace build +{ + void + mkdir (const path& p, mode_t m) + { + if (::mkdir (p.string ().c_str (), m) != 0) + throw system_error (errno, system_category ()); + } + + rmdir_status + try_rmdir (const path& p) + { + rmdir_status r (rmdir_status::success); + + if (::rmdir (p.string ().c_str ()) != 0) + { + if (errno == ENOENT) + r = rmdir_status::not_exist; + else if (errno == ENOTEMPTY || errno == EEXIST) + r = rmdir_status::not_empty; + else + throw system_error (errno, system_category ()); + } + + return r; + } + + rmfile_status + try_rmfile (const path& p) + { + rmfile_status r (rmfile_status::success); + + if (::unlink (p.string ().c_str ()) != 0) + { + if (errno == ENOENT || errno == ENOTDIR) + r = rmfile_status::not_exist; + else + throw system_error (errno, system_category ()); + } + + return r; + } +} -- cgit v1.1