From: Chaoren Lin Date: Sat, 27 Jun 2015 23:11:34 +0000 (+0000) Subject: Replace `rm -rf` with more portable implementation. X-Git-Tag: llvmorg-3.7.0-rc1~1301 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=226937eb15385a81144da725239127097acd3bc2;p=platform%2Fupstream%2Fllvm.git Replace `rm -rf` with more portable implementation. Reviewers: clayborg, vharron Subscribers: lldb-commits Differential Revision: http://reviews.llvm.org/D10787 llvm-svn: 240895 --- diff --git a/lldb/source/Host/posix/FileSystem.cpp b/lldb/source/Host/posix/FileSystem.cpp index 626c37d..1ec53e2 100644 --- a/lldb/source/Host/posix/FileSystem.cpp +++ b/lldb/source/Host/posix/FileSystem.cpp @@ -10,6 +10,7 @@ #include "lldb/Host/FileSystem.h" // C includes +#include #include #include #include @@ -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 {