#include "log.h"
#include "config.h"
#include "porting.h"
-#ifdef __ANDROID__
-#include "settings.h" // For g_settings
-#endif
namespace fs
{
bool RecursiveDelete(const std::string &path)
{
- infostream<<"Recursively deleting \""<<path<<"\""<<std::endl;
-
- DWORD attr = GetFileAttributes(path.c_str());
- bool is_directory = (attr != INVALID_FILE_ATTRIBUTES &&
- (attr & FILE_ATTRIBUTE_DIRECTORY));
- if(!is_directory)
- {
- infostream<<"RecursiveDelete: Deleting file "<<path<<std::endl;
- //bool did = DeleteFile(path.c_str());
- bool did = true;
- if(!did){
- errorstream<<"RecursiveDelete: Failed to delete file "
- <<path<<std::endl;
+ infostream << "Recursively deleting \"" << path << "\"" << std::endl;
+ if (!IsDir(path)) {
+ infostream << "RecursiveDelete: Deleting file " << path << std::endl;
+ if (!DeleteFile(path.c_str())) {
+ errorstream << "RecursiveDelete: Failed to delete file "
+ << path << std::endl;
return false;
}
+ return true;
}
- else
- {
- infostream<<"RecursiveDelete: Deleting content of directory "
- <<path<<std::endl;
- std::vector<DirListNode> content = GetDirListing(path);
- for(size_t i=0; i<content.size(); i++){
- const DirListNode &n = content[i];
- std::string fullpath = path + DIR_DELIM + n.name;
- bool did = RecursiveDelete(fullpath);
- if(!did){
- errorstream<<"RecursiveDelete: Failed to recurse to "
- <<fullpath<<std::endl;
- return false;
- }
- }
- infostream<<"RecursiveDelete: Deleting directory "<<path<<std::endl;
- //bool did = RemoveDirectory(path.c_str();
- bool did = true;
- if(!did){
- errorstream<<"Failed to recursively delete directory "
- <<path<<std::endl;
+ infostream << "RecursiveDelete: Deleting content of directory "
+ << path << std::endl;
+ std::vector<DirListNode> content = GetDirListing(path);
+ for (const DirListNode &n: content) {
+ std::string fullpath = path + DIR_DELIM + n.name;
+ if (!RecursiveDelete(fullpath)) {
+ errorstream << "RecursiveDelete: Failed to recurse to "
+ << fullpath << std::endl;
return false;
}
}
+ infostream << "RecursiveDelete: Deleting directory " << path << std::endl;
+ if (!RemoveDirectory(path.c_str())) {
+ errorstream << "Failed to recursively delete directory "
+ << path << std::endl;
+ return false;
+ }
return true;
}
infostream<<"Removing \""<<path<<"\""<<std::endl;
- //return false;
-
pid_t child_pid = fork();
if(child_pid == 0)
{
// Child
- char argv_data[3][10000];
- strcpy(argv_data[0], "/bin/rm");
- strcpy(argv_data[1], "-rf");
- strncpy(argv_data[2], path.c_str(), 10000);
- char *argv[4];
- argv[0] = argv_data[0];
- argv[1] = argv_data[1];
- argv[2] = argv_data[2];
- argv[3] = NULL;
+ const char *argv[4] = {
+#ifdef __ANDROID__
+ "/system/bin/rm",
+#else
+ "/bin/rm",
+#endif
+ "-rf",
+ path.c_str(),
+ NULL
+ };
verbosestream<<"Executing '"<<argv[0]<<"' '"<<argv[1]<<"' '"
<<argv[2]<<"'"<<std::endl;
- execv(argv[0], argv);
+ execv(argv[0], const_cast<char**>(argv));
// Execv shouldn't return. Failed.
_exit(1);
pid_t tpid;
do{
tpid = wait(&child_status);
- //if(tpid != child_pid) process_terminated(tpid);
}while(tpid != child_pid);
return (child_status == 0);
}
compatible with lua's os.tmpname which under the default
configuration hardcodes mkstemp("/tmp/lua_XXXXXX").
*/
+
#ifdef __ANDROID__
- return g_settings->get("TMPFolder");
+ return porting::path_cache;
#else
return DIR_DELIM "tmp";
#endif
}
}
-bool DeletePaths(const std::vector<std::string> &paths)
-{
- bool success = true;
- // Go backwards to succesfully delete the output of GetRecursiveSubPaths
- for(int i=paths.size()-1; i>=0; i--){
- const std::string &path = paths[i];
- bool did = DeleteSingleFileOrEmptyDirectory(path);
- if(!did){
- errorstream<<"Failed to delete "<<path<<std::endl;
- success = false;
- }
- }
- return success;
-}
-
bool RecursiveDeleteContent(const std::string &path)
{
infostream<<"Removing content of \""<<path<<"\""<<std::endl;
const char *GetFilenameFromPath(const char *path)
{
const char *filename = strrchr(path, DIR_DELIM_CHAR);
+ // Consistent with IsDirDelimiter this function handles '/' too
+ if (DIR_DELIM_CHAR != '/') {
+ const char *tmp = strrchr(path, '/');
+ if (tmp && tmp > filename)
+ filename = tmp;
+ }
return filename ? filename + 1 : path;
}
return true;
}
+bool ReadFile(const std::string &path, std::string &out)
+{
+ std::ifstream is(path, std::ios::binary | std::ios::ate);
+ if (!is.good()) {
+ return false;
+ }
+
+ auto size = is.tellg();
+ out.resize(size);
+ is.seekg(0);
+ is.read(&out[0], size);
+
+ return true;
+}
+
bool Rename(const std::string &from, const std::string &to)
{
return rename(from.c_str(), to.c_str()) == 0;