Wrap create_directory calls in try...catch blocks.

Ignores any exceptions thrown if directory exists, otherwise re-throws exception.

Rebased-By: Wladimir J. van der Laan <laanwj@gmail.com>
This commit is contained in:
Brandon Dahler
2014-03-23 20:14:43 -05:00
committed by Wladimir J. van der Laan
parent 5a2ed60a04
commit 2b7709dc84
5 changed files with 22 additions and 4 deletions

View File

@@ -976,7 +976,7 @@ boost::filesystem::path GetDefaultDataDir()
#ifdef MAC_OSX
// Mac
pathRet /= "Library/Application Support";
fs::create_directory(pathRet);
TryCreateDirectory(pathRet);
return pathRet / "Bitcoin";
#else
// Unix
@@ -1090,6 +1090,23 @@ bool RenameOver(boost::filesystem::path src, boost::filesystem::path dest)
#endif /* WIN32 */
}
// Ignores exceptions thrown by boost's create_directory if the requested directory exists.
// Specifically handles case where path p exists, but it wasn't possible for the user to write to the parent directory.
bool TryCreateDirectory(const boost::filesystem::path& p)
{
try
{
return boost::filesystem::create_directory(p);
} catch (boost::filesystem::filesystem_error) {
if (!boost::filesystem::exists(p) || !boost::filesystem::is_directory(p))
throw;
}
// create_directory didn't create the directory, it had to have existed already
return false;
}
void FileCommit(FILE *fileout)
{
fflush(fileout); // harmless if redundantly called