aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--butl/filesystem6
-rw-r--r--butl/filesystem.cxx14
2 files changed, 20 insertions, 0 deletions
diff --git a/butl/filesystem b/butl/filesystem
index 4d0b7ef..63b19ff 100644
--- a/butl/filesystem
+++ b/butl/filesystem
@@ -56,6 +56,12 @@ namespace butl
mkdir_status
try_mkdir (const path&, mode_t = 0777);
+ // The '-p' version of the above (i.e., it creates the parent
+ // directories if necessary).
+ //
+ mkdir_status
+ try_mkdir_p (const path&, mode_t = 0777);
+
// Try to remove the directory returning not_exist if it does not
// exist and not_empty if it is not empty. All other errors are
// reported by throwing std::system_error.
diff --git a/butl/filesystem.cxx b/butl/filesystem.cxx
index 4cf60b2..c65d591 100644
--- a/butl/filesystem.cxx
+++ b/butl/filesystem.cxx
@@ -108,6 +108,20 @@ namespace butl
return r;
}
+ mkdir_status
+ try_mkdir_p (const path& p, mode_t m)
+ {
+ if (!p.root ())
+ {
+ path d (p.directory ());
+
+ if (!dir_exists (d))
+ try_mkdir_p (d, m);
+ }
+
+ return try_mkdir (p, m);
+ }
+
rmdir_status
try_rmdir (const path& p)
{