diff options
Diffstat (limited to 'src/filesys.cpp')
-rw-r--r-- | src/filesys.cpp | 282 |
1 files changed, 139 insertions, 143 deletions
diff --git a/src/filesys.cpp b/src/filesys.cpp index 0bc351669..e09867d89 100644 --- a/src/filesys.cpp +++ b/src/filesys.cpp @@ -57,7 +57,7 @@ std::vector<DirListNode> GetDirListing(const std::string &pathstring) dwError = GetLastError(); if (dwError != ERROR_FILE_NOT_FOUND && dwError != ERROR_PATH_NOT_FOUND) { errorstream << "GetDirListing: FindFirstFile error." - << " Error is " << dwError << std::endl; + << " Error is " << dwError << std::endl; } } else { // NOTE: @@ -74,8 +74,9 @@ std::vector<DirListNode> GetDirListing(const std::string &pathstring) while (FindNextFile(hFind, &FindFileData) != 0) { DirListNode node; node.name = FindFileData.cFileName; - node.dir = FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY; - if(node.name != "." && node.name != "..") + node.dir = FindFileData.dwFileAttributes & + FILE_ATTRIBUTE_DIRECTORY; + if (node.name != "." && node.name != "..") listing.push_back(node); } @@ -83,10 +84,10 @@ std::vector<DirListNode> GetDirListing(const std::string &pathstring) FindClose(hFind); if (dwError != ERROR_NO_MORE_FILES) { errorstream << "GetDirListing: FindNextFile error." - << " Error is " << dwError << std::endl; + << " Error is " << dwError << std::endl; listing.clear(); return listing; - } + } } return listing; } @@ -94,9 +95,9 @@ std::vector<DirListNode> GetDirListing(const std::string &pathstring) bool CreateDir(const std::string &path) { bool r = CreateDirectory(path.c_str(), NULL); - if(r == true) + if (r == true) return true; - if(GetLastError() == ERROR_ALREADY_EXISTS) + if (GetLastError() == ERROR_ALREADY_EXISTS) return true; return false; } @@ -114,8 +115,7 @@ bool IsPathAbsolute(const std::string &path) bool IsDir(const std::string &path) { DWORD attr = GetFileAttributes(path.c_str()); - return (attr != INVALID_FILE_ATTRIBUTES && - (attr & FILE_ATTRIBUTE_DIRECTORY)); + return (attr != INVALID_FILE_ATTRIBUTES && (attr & FILE_ATTRIBUTE_DIRECTORY)); } bool IsDirDelimiter(char c) @@ -129,27 +129,27 @@ bool RecursiveDelete(const std::string &path) if (!IsDir(path)) { infostream << "RecursiveDelete: Deleting file " << path << std::endl; if (!DeleteFile(path.c_str())) { - errorstream << "RecursiveDelete: Failed to delete file " - << path << std::endl; + errorstream << "RecursiveDelete: Failed to delete file " << path + << std::endl; return false; } return true; } - infostream << "RecursiveDelete: Deleting content of directory " - << path << std::endl; + infostream << "RecursiveDelete: Deleting content of directory " << path + << std::endl; std::vector<DirListNode> content = GetDirListing(path); - for (const DirListNode &n: content) { + 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; + << 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; + errorstream << "Failed to recursively delete directory " << path + << std::endl; return false; } return true; @@ -159,14 +159,11 @@ bool DeleteSingleFileOrEmptyDirectory(const std::string &path) { DWORD attr = GetFileAttributes(path.c_str()); bool is_directory = (attr != INVALID_FILE_ATTRIBUTES && - (attr & FILE_ATTRIBUTE_DIRECTORY)); - if(!is_directory) - { + (attr & FILE_ATTRIBUTE_DIRECTORY)); + if (!is_directory) { bool did = DeleteFile(path.c_str()); return did; - } - else - { + } else { bool did = RemoveDirectory(path.c_str()); return did; } @@ -175,14 +172,16 @@ bool DeleteSingleFileOrEmptyDirectory(const std::string &path) std::string TempPath() { DWORD bufsize = GetTempPath(0, NULL); - if(bufsize == 0){ - errorstream<<"GetTempPath failed, error = "<<GetLastError()<<std::endl; + if (bufsize == 0) { + errorstream << "GetTempPath failed, error = " << GetLastError() + << std::endl; return ""; } std::vector<char> buf(bufsize); DWORD len = GetTempPath(bufsize, &buf[0]); - if(len == 0 || len > bufsize){ - errorstream<<"GetTempPath failed, error = "<<GetLastError()<<std::endl; + if (len == 0 || len > bufsize) { + errorstream << "GetTempPath failed, error = " << GetLastError() + << std::endl; return ""; } return std::string(buf.begin(), buf.begin() + len); @@ -202,8 +201,8 @@ std::vector<DirListNode> GetDirListing(const std::string &pathstring) DIR *dp; struct dirent *dirp; - if((dp = opendir(pathstring.c_str())) == NULL) { - //infostream<<"Error("<<errno<<") opening "<<pathstring<<std::endl; + if ((dp = opendir(pathstring.c_str())) == NULL) { + // infostream<<"Error("<<errno<<") opening "<<pathstring<<std::endl; return listing; } @@ -211,7 +210,7 @@ std::vector<DirListNode> GetDirListing(const std::string &pathstring) // NOTE: // Be very sure to not include '..' in the results, it will // result in an epic failure when deleting stuff. - if(strcmp(dirp->d_name, ".") == 0 || strcmp(dirp->d_name, "..") == 0) + if (strcmp(dirp->d_name, ".") == 0 || strcmp(dirp->d_name, "..") == 0) continue; DirListNode node; @@ -227,7 +226,7 @@ std::vector<DirListNode> GetDirListing(const std::string &pathstring) Also we don't know whether symlinks are directories or not. */ #ifdef _DIRENT_HAVE_D_TYPE - if(dirp->d_type != DT_UNKNOWN && dirp->d_type != DT_LNK) + if (dirp->d_type != DT_UNKNOWN && dirp->d_type != DT_LNK) isdir = (dirp->d_type == DT_DIR); #endif /* _DIRENT_HAVE_D_TYPE */ @@ -235,8 +234,10 @@ std::vector<DirListNode> GetDirListing(const std::string &pathstring) Was d_type DT_UNKNOWN, DT_LNK or nonexistent? If so, try stat(). */ - if(isdir == -1) { - struct stat statbuf{}; + if (isdir == -1) { + struct stat statbuf + { + }; if (stat((pathstring + "/" + node.name).c_str(), &statbuf)) continue; isdir = ((statbuf.st_mode & S_IFDIR) == S_IFDIR); @@ -260,13 +261,14 @@ bool CreateDir(const std::string &path) if (errno == EEXIST) return true; return false; - } bool PathExists(const std::string &path) { - struct stat st{}; - return (stat(path.c_str(),&st) == 0); + struct stat st + { + }; + return (stat(path.c_str(), &st) == 0); } bool IsPathAbsolute(const std::string &path) @@ -276,8 +278,10 @@ bool IsPathAbsolute(const std::string &path) bool IsDir(const std::string &path) { - struct stat statbuf{}; - if(stat(path.c_str(), &statbuf)) + struct stat statbuf + { + }; + if (stat(path.c_str(), &statbuf)) return false; // Actually error; but certainly not a directory return ((statbuf.st_mode & S_IFDIR) == S_IFDIR); } @@ -293,14 +297,13 @@ bool RecursiveDelete(const std::string &path) Execute the 'rm' command directly, by fork() and execve() */ - infostream<<"Removing \""<<path<<"\""<<std::endl; + infostream << "Removing \"" << path << "\"" << std::endl; - //return false; + // return false; pid_t child_pid = fork(); - if(child_pid == 0) - { + if (child_pid == 0) { // Child char argv_data[3][10000]; #ifdef __ANDROID__ @@ -316,23 +319,21 @@ bool RecursiveDelete(const std::string &path) argv[2] = argv_data[2]; argv[3] = NULL; - verbosestream<<"Executing '"<<argv[0]<<"' '"<<argv[1]<<"' '" - <<argv[2]<<"'"<<std::endl; + verbosestream << "Executing '" << argv[0] << "' '" << argv[1] << "' '" + << argv[2] << "'" << std::endl; execv(argv[0], argv); // Execv shouldn't return. Failed. _exit(1); - } - else - { + } else { // Parent int child_status; pid_t tpid; - do{ + do { tpid = wait(&child_status); - //if(tpid != child_pid) process_terminated(tpid); - }while(tpid != child_pid); + // if(tpid != child_pid) process_terminated(tpid); + } while (tpid != child_pid); return (child_status == 0); } } @@ -343,14 +344,14 @@ bool DeleteSingleFileOrEmptyDirectory(const std::string &path) bool did = (rmdir(path.c_str()) == 0); if (!did) errorstream << "rmdir errno: " << errno << ": " << strerror(errno) - << std::endl; + << std::endl; return did; } bool did = (unlink(path.c_str()) == 0); if (!did) errorstream << "unlink errno: " << errno << ": " << strerror(errno) - << std::endl; + << std::endl; return did; } @@ -376,7 +377,7 @@ std::string TempPath() void GetRecursiveDirs(std::vector<std::string> &dirs, const std::string &dir) { - static const std::set<char> chars_to_ignore = { '_', '.' }; + static const std::set<char> chars_to_ignore = {'_', '.'}; if (dir.empty() || !IsDir(dir)) return; dirs.push_back(dir); @@ -390,10 +391,8 @@ std::vector<std::string> GetRecursiveDirs(const std::string &dir) return result; } -void GetRecursiveSubPaths(const std::string &path, - std::vector<std::string> &dst, - bool list_files, - const std::set<char> &ignore) +void GetRecursiveSubPaths(const std::string &path, std::vector<std::string> &dst, + bool list_files, const std::set<char> &ignore) { std::vector<DirListNode> content = GetDirListing(path); for (const auto &n : content) { @@ -411,11 +410,11 @@ 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--){ + 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; + if (!did) { + errorstream << "Failed to delete " << path << std::endl; success = false; } } @@ -424,15 +423,16 @@ bool DeletePaths(const std::vector<std::string> &paths) bool RecursiveDeleteContent(const std::string &path) { - infostream<<"Removing content of \""<<path<<"\""<<std::endl; + infostream << "Removing content of \"" << path << "\"" << std::endl; std::vector<DirListNode> list = GetDirListing(path); for (const DirListNode &dln : list) { - if(trim(dln.name) == "." || trim(dln.name) == "..") + if (trim(dln.name) == "." || trim(dln.name) == "..") continue; std::string childpath = path + DIR_DELIM + dln.name; bool r = RecursiveDelete(childpath); - if(!r) { - errorstream << "Removing \"" << childpath << "\" failed" << std::endl; + if (!r) { + errorstream << "Removing \"" << childpath << "\" failed" + << std::endl; return false; } } @@ -444,15 +444,14 @@ bool CreateAllDirs(const std::string &path) std::vector<std::string> tocreate; std::string basepath = path; - while(!PathExists(basepath)) - { + while (!PathExists(basepath)) { tocreate.push_back(basepath); basepath = RemoveLastPathComponent(basepath); - if(basepath.empty()) + if (basepath.empty()) break; } - for(int i=tocreate.size()-1;i>=0;i--) - if(!CreateDir(tocreate[i])) + for (int i = tocreate.size() - 1; i >= 0; i--) + if (!CreateDir(tocreate[i])) return false; return true; } @@ -460,16 +459,16 @@ bool CreateAllDirs(const std::string &path) bool CopyFileContents(const std::string &source, const std::string &target) { FILE *sourcefile = fopen(source.c_str(), "rb"); - if(sourcefile == NULL){ - errorstream<<source<<": can't open for reading: " - <<strerror(errno)<<std::endl; + if (sourcefile == NULL) { + errorstream << source << ": can't open for reading: " << strerror(errno) + << std::endl; return false; } FILE *targetfile = fopen(target.c_str(), "wb"); - if(targetfile == NULL){ - errorstream<<target<<": can't open for writing: " - <<strerror(errno)<<std::endl; + if (targetfile == NULL) { + errorstream << target << ": can't open for writing: " << strerror(errno) + << std::endl; fclose(sourcefile); return false; } @@ -478,34 +477,33 @@ bool CopyFileContents(const std::string &source, const std::string &target) bool retval = true; bool done = false; char readbuffer[BUFSIZ]; - while(!done){ - size_t readbytes = fread(readbuffer, 1, - sizeof(readbuffer), sourcefile); + while (!done) { + size_t readbytes = fread(readbuffer, 1, sizeof(readbuffer), sourcefile); total += readbytes; - if(ferror(sourcefile)){ - errorstream<<source<<": IO error: " - <<strerror(errno)<<std::endl; + if (ferror(sourcefile)) { + errorstream << source << ": IO error: " << strerror(errno) + << std::endl; retval = false; done = true; } - if(readbytes > 0){ + if (readbytes > 0) { fwrite(readbuffer, 1, readbytes, targetfile); } - if(feof(sourcefile) || ferror(sourcefile)){ + if (feof(sourcefile) || ferror(sourcefile)) { // flush destination file to catch write errors // (e.g. disk full) fflush(targetfile); done = true; } - if(ferror(targetfile)){ - errorstream<<target<<": IO error: " - <<strerror(errno)<<std::endl; + if (ferror(targetfile)) { + errorstream << target << ": IO error: " << strerror(errno) + << std::endl; retval = false; done = true; } } - infostream<<"copied "<<total<<" bytes from " - <<source<<" to "<<target<<std::endl; + infostream << "copied " << total << " bytes from " << source << " to " << target + << std::endl; fclose(sourcefile); fclose(targetfile); return retval; @@ -513,8 +511,8 @@ bool CopyFileContents(const std::string &source, const std::string &target) bool CopyDir(const std::string &source, const std::string &target) { - if(PathExists(source)){ - if(!PathExists(target)){ + if (PathExists(source)) { + if (!PathExists(target)) { fs::CreateAllDirs(target); } bool retval = true; @@ -523,13 +521,12 @@ bool CopyDir(const std::string &source, const std::string &target) for (const auto &dln : content) { std::string sourcechild = source + DIR_DELIM + dln.name; std::string targetchild = target + DIR_DELIM + dln.name; - if(dln.dir){ - if(!fs::CopyDir(sourcechild, targetchild)){ + if (dln.dir) { + if (!fs::CopyDir(sourcechild, targetchild)) { retval = false; } - } - else { - if(!fs::CopyFileContents(sourcechild, targetchild)){ + } else { + if (!fs::CopyFileContents(sourcechild, targetchild)) { retval = false; } } @@ -546,74 +543,70 @@ bool PathStartsWith(const std::string &path, const std::string &prefix) size_t pathpos = 0; size_t prefixsize = prefix.size(); size_t prefixpos = 0; - for(;;){ - bool delim1 = pathpos == pathsize - || IsDirDelimiter(path[pathpos]); - bool delim2 = prefixpos == prefixsize - || IsDirDelimiter(prefix[prefixpos]); + for (;;) { + bool delim1 = pathpos == pathsize || IsDirDelimiter(path[pathpos]); + bool delim2 = prefixpos == prefixsize || + IsDirDelimiter(prefix[prefixpos]); - if(delim1 != delim2) + if (delim1 != delim2) return false; - if(delim1){ - while(pathpos < pathsize && - IsDirDelimiter(path[pathpos])) + if (delim1) { + while (pathpos < pathsize && IsDirDelimiter(path[pathpos])) ++pathpos; - while(prefixpos < prefixsize && + while (prefixpos < prefixsize && IsDirDelimiter(prefix[prefixpos])) ++prefixpos; - if(prefixpos == prefixsize) + if (prefixpos == prefixsize) return true; - if(pathpos == pathsize) + if (pathpos == pathsize) return false; - } - else{ + } else { size_t len = 0; - do{ - char pathchar = path[pathpos+len]; - char prefixchar = prefix[prefixpos+len]; - if(FILESYS_CASE_INSENSITIVE){ + do { + char pathchar = path[pathpos + len]; + char prefixchar = prefix[prefixpos + len]; + if (FILESYS_CASE_INSENSITIVE) { pathchar = tolower(pathchar); prefixchar = tolower(prefixchar); } - if(pathchar != prefixchar) + if (pathchar != prefixchar) return false; ++len; - } while(pathpos+len < pathsize - && !IsDirDelimiter(path[pathpos+len]) - && prefixpos+len < prefixsize - && !IsDirDelimiter( - prefix[prefixpos+len])); + } while (pathpos + len < pathsize && + !IsDirDelimiter(path[pathpos + len]) && + prefixpos + len < prefixsize && + !IsDirDelimiter(prefix[prefixpos + len])); pathpos += len; prefixpos += len; } } } -std::string RemoveLastPathComponent(const std::string &path, - std::string *removed, int count) +std::string RemoveLastPathComponent( + const std::string &path, std::string *removed, int count) { - if(removed) + if (removed) *removed = ""; size_t remaining = path.size(); - for(int i = 0; i < count; ++i){ + for (int i = 0; i < count; ++i) { // strip a dir delimiter - while(remaining != 0 && IsDirDelimiter(path[remaining-1])) + while (remaining != 0 && IsDirDelimiter(path[remaining - 1])) remaining--; // strip a path component size_t component_end = remaining; - while(remaining != 0 && !IsDirDelimiter(path[remaining-1])) + while (remaining != 0 && !IsDirDelimiter(path[remaining - 1])) remaining--; size_t component_start = remaining; // strip a dir delimiter - while(remaining != 0 && IsDirDelimiter(path[remaining-1])) + while (remaining != 0 && IsDirDelimiter(path[remaining - 1])) remaining--; - if(removed){ - std::string component = path.substr(component_start, - component_end - component_start); - if(i) + if (removed) { + std::string component = path.substr( + component_start, component_end - component_start); + if (i) *removed = component + DIR_DELIM + *removed; else *removed = component; @@ -629,16 +622,16 @@ std::string RemoveRelativePathComponents(std::string path) while (pos != 0) { size_t component_with_delim_end = pos; // skip a dir delimiter - while (pos != 0 && IsDirDelimiter(path[pos-1])) + while (pos != 0 && IsDirDelimiter(path[pos - 1])) pos--; // strip a path component size_t component_end = pos; - while (pos != 0 && !IsDirDelimiter(path[pos-1])) + while (pos != 0 && !IsDirDelimiter(path[pos - 1])) pos--; size_t component_start = pos; - std::string component = path.substr(component_start, - component_end - component_start); + std::string component = path.substr( + component_start, component_end - component_start); bool remove_this_component = false; if (component == ".") { remove_this_component = true; @@ -651,14 +644,16 @@ std::string RemoveRelativePathComponents(std::string path) } if (remove_this_component) { - while (pos != 0 && IsDirDelimiter(path[pos-1])) + while (pos != 0 && IsDirDelimiter(path[pos - 1])) pos--; if (component_start == 0) { // We need to remove the delemiter too - path = path.substr(component_with_delim_end, std::string::npos); + path = path.substr(component_with_delim_end, + std::string::npos); } else { path = path.substr(0, pos) + DIR_DELIM + - path.substr(component_with_delim_end, std::string::npos); + path.substr(component_with_delim_end, + std::string::npos); } if (pos > 0) pos++; @@ -670,7 +665,7 @@ std::string RemoveRelativePathComponents(std::string path) // remove trailing dir delimiters pos = path.size(); - while (pos != 0 && IsDirDelimiter(path[pos-1])) + while (pos != 0 && IsDirDelimiter(path[pos - 1])) pos--; return path.substr(0, pos); } @@ -682,7 +677,8 @@ std::string AbsolutePath(const std::string &path) #else char *abs_path = realpath(path.c_str(), NULL); #endif - if (!abs_path) return ""; + if (!abs_path) + return ""; std::string abs_path_str(abs_path); free(abs_path); return abs_path_str; @@ -721,9 +717,10 @@ bool safeWriteToFile(const std::string &path, const std::string &content) // Move the finished temporary file over the real file #ifdef _WIN32 - // When creating the file, it can cause Windows Search indexer, virus scanners and other apps - // to query the file. This can make the move file call below fail. - // We retry up to 5 times, with a 1ms sleep between, before we consider the whole operation failed + // When creating the file, it can cause Windows Search indexer, virus scanners and + // other apps to query the file. This can make the move file call below fail. We + // retry up to 5 times, with a 1ms sleep between, before we consider the whole + // operation failed int number_attempts = 0; while (number_attempts < 5) { rename_success = MoveFileEx(tmp_file.c_str(), path.c_str(), @@ -756,4 +753,3 @@ bool Rename(const std::string &from, const std::string &to) } } // namespace fs - |