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, 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
-