aboutsummaryrefslogtreecommitdiff
path: root/src/filesys.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/filesys.cpp')
-rw-r--r--src/filesys.cpp282
1 files changed, 143 insertions, 139 deletions
diff --git a/src/filesys.cpp b/src/filesys.cpp
index e09867d89..0bc351669 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,9 +74,8 @@ 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);
}
@@ -84,10 +83,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;
}
@@ -95,9 +94,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;
}
@@ -115,7 +114,8 @@ 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,11 +159,14 @@ 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;
}
@@ -172,16 +175,14 @@ 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);
@@ -201,8 +202,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;
}
@@ -210,7 +211,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;
@@ -226,7 +227,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 */
@@ -234,10 +235,8 @@ 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);
@@ -261,14 +260,13 @@ 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)
@@ -278,10 +276,8 @@ 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);
}
@@ -297,13 +293,14 @@ 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__
@@ -319,21 +316,23 @@ 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);
}
}
@@ -344,14 +343,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;
}
@@ -377,7 +376,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);
@@ -391,8 +390,10 @@ 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) {
@@ -410,11 +411,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;
}
}
@@ -423,16 +424,15 @@ 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,14 +444,15 @@ 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;
}
@@ -459,16 +460,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;
}
@@ -477,33 +478,34 @@ 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;
@@ -511,8 +513,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;
@@ -521,12 +523,13 @@ 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;
}
}
@@ -543,70 +546,74 @@ 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;
@@ -622,16 +629,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;
@@ -644,16 +651,14 @@ 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++;
@@ -665,7 +670,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);
}
@@ -677,8 +682,7 @@ 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;
@@ -717,10 +721,9 @@ 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(),
@@ -753,3 +756,4 @@ bool Rename(const std::string &from, const std::string &to)
}
} // namespace fs
+