Replace `rm -rf` with more portable implementation.

Reviewers: clayborg, vharron

Subscribers: lldb-commits

Differential Revision: http://reviews.llvm.org/D10787

llvm-svn: 240895
This commit is contained in:
Chaoren Lin 2015-06-27 23:11:34 +00:00
parent ccc06b36c1
commit 226937eb15
1 changed files with 20 additions and 5 deletions

View File

@ -10,6 +10,7 @@
#include "lldb/Host/FileSystem.h"
// C includes
#include <dirent.h>
#include <sys/mount.h>
#include <sys/param.h>
#include <sys/stat.h>
@ -81,11 +82,25 @@ FileSystem::DeleteDirectory(const FileSpec &file_spec, bool recurse)
{
if (recurse)
{
StreamString command;
command.Printf("rm -rf \"%s\"", file_spec.GetCString());
int status = ::system(command.GetString().c_str());
if (status != 0)
error.SetError(status, eErrorTypeGeneric);
DIR *dirp = opendir(file_spec.GetCString());
if (!dirp)
{
error.SetErrorToErrno();
return error;
}
struct dirent *direntp;
while (error.Success() && (direntp = readdir(dirp)))
{
if (direntp->d_type == DT_DIR)
error = DeleteDirectory(FileSpec{direntp->d_name, false}, true);
else if (::unlink(direntp->d_name) != 0)
error.SetErrorToErrno();
}
if (closedir(dirp) != 0)
error.SetErrorToErrno();
if (error.Fail())
return error;
return DeleteDirectory(file_spec, false);
}
else
{