fs/FileInfo: new library providing GetFileInfo()

Replaces StatFile(), with a portable data object.
This commit is contained in:
Max Kellermann
2015-02-28 20:42:50 +01:00
parent 00583bc4a8
commit 90a61b6bab
11 changed files with 171 additions and 70 deletions

View File

@@ -34,6 +34,7 @@
#include "fs/io/TextFile.hxx"
#include "fs/io/BufferedOutputStream.hxx"
#include "fs/io/FileOutputStream.hxx"
#include "fs/FileInfo.hxx"
#include "config/Block.hxx"
#include "fs/FileSystem.hxx"
#include "util/CharUtil.hxx"
@@ -124,15 +125,13 @@ SimpleDatabase::Check(Error &error) const
const auto dirPath = path.GetDirectoryName();
/* Check that the parent part of the path is a directory */
struct stat st;
if (!StatFile(dirPath, st)) {
error.FormatErrno("Couldn't stat parent directory of db file "
"\"%s\"",
path_utf8.c_str());
FileInfo fi;
if (!GetFileInfo(dirPath, fi, error)) {
error.AddPrefix("On parent directory of db file: ");
return false;
}
if (!S_ISDIR(st.st_mode)) {
if (!fi.IsDirectory()) {
error.Format(simple_db_domain,
"Couldn't create db file \"%s\" because the "
"parent path is not a directory",
@@ -154,14 +153,11 @@ SimpleDatabase::Check(Error &error) const
}
/* Path exists, now check if it's a regular file */
struct stat st;
if (!StatFile(path, st)) {
error.FormatErrno("Couldn't stat db file \"%s\"",
path_utf8.c_str());
FileInfo fi;
if (!GetFileInfo(path, fi, error))
return false;
}
if (!S_ISREG(st.st_mode)) {
if (!fi.IsRegular()) {
error.Format(simple_db_domain,
"db file \"%s\" is not a regular file",
path_utf8.c_str());
@@ -193,9 +189,9 @@ SimpleDatabase::Load(Error &error)
if (!db_load_internal(file, *root, error) || !file.Check(error))
return false;
struct stat st;
if (StatFile(path, st))
mtime = st.st_mtime;
FileInfo fi;
if (GetFileInfo(path, fi))
mtime = fi.GetModificationTime();
return true;
}
@@ -425,9 +421,9 @@ SimpleDatabase::Save(Error &error)
if (!fos.Commit(error))
return false;
struct stat st;
if (StatFile(path, st))
mtime = st.st_mtime;
FileInfo fi;
if (GetFileInfo(path, fi))
mtime = fi.GetModificationTime();
return true;
}

View File

@@ -24,7 +24,7 @@
#include "InotifyDomain.hxx"
#include "storage/StorageInterface.hxx"
#include "fs/AllocatedPath.hxx"
#include "fs/FileSystem.hxx"
#include "fs/FileInfo.hxx"
#include "util/Error.hxx"
#include "Log.hxx"
@@ -179,7 +179,6 @@ recursive_watch_subdirectories(WatchDirectory *directory,
}
while ((ent = readdir(dir))) {
struct stat st;
int ret;
if (skip_path(ent->d_name))
@@ -187,15 +186,15 @@ recursive_watch_subdirectories(WatchDirectory *directory,
const auto child_path_fs =
AllocatedPath::Build(path_fs, ent->d_name);
ret = StatFile(child_path_fs, st);
if (ret < 0) {
FormatErrno(inotify_domain,
"Failed to stat %s",
child_path_fs.c_str());
FileInfo fi;
if (!GetFileInfo(child_path_fs, fi, error)) {
LogError(error);
error.Clear();
continue;
}
if (!S_ISDIR(st.st_mode))
if (!fi.IsDirectory())
continue;
ret = inotify_source->Add(child_path_fs.c_str(), IN_MASK,