X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Ffs%2Fstat.cpp;h=f4566ae8b6ef8363cd68f709f2d66924137a58a2;hp=ccd344b875e809ecdbf3016e96d4576ab0c898dc;hb=817e584903996a041692640720a5a272d847a3c7;hpb=19edaf3b45bc4c23459fc8ddd552dcfa33eecc71 diff --git a/source/fs/stat.cpp b/source/fs/stat.cpp index ccd344b..f4566ae 100644 --- a/source/fs/stat.cpp +++ b/source/fs/stat.cpp @@ -1,74 +1,67 @@ -#ifdef WIN32 -#include -#endif -#include #include "path.h" #include "stat.h" +#include "stat_private.h" + +using namespace std; namespace Msp { namespace FS { -int stat(const Path &fn, struct stat &st) -{ - return ::stat(fn.str().c_str(), &st); -} +Stat::Private::Private(): + owner_id(0), + group_id(0) +{ } -struct stat stat(const Path &fn) -{ - struct stat st; - if(stat(fn, st)==-1) - throw system_error("stat"); - return st; -} -int lstat(const Path &fn, struct stat &st) -{ -#ifdef WIN32 - return stat(fn, st); -#else - return ::lstat(fn.str().c_str(), &st); -#endif -} +Stat::Stat(): + exists(false), + type(UNKNOWN), + size(0), + alloc_size(0), + priv(0) +{ } -struct stat lstat(const Path &fn) -{ - struct stat st; - if(lstat(fn, st)==-1) - throw system_error("lstat"); - return st; -} +Stat::Stat(const Stat &other): + exists(other.exists), + type(other.type), + size(other.type), + alloc_size(other.alloc_size), + mtime(other.mtime), + owner_info(other.owner_info), + priv(other.priv ? new Private(*other.priv) : 0) +{ } -bool exists(const Path &path) +Stat &Stat::operator=(const Stat &other) { - return access(path.str().c_str(), F_OK)==0; + exists = other.exists; + type = other.type; + size = other.size; + alloc_size = other.alloc_size; + mtime = other.mtime; + owner_info = other.owner_info; + delete priv; + priv = (other.priv ? new Private(*other.priv) : 0); + + return *this; } -bool is_reg(const Path &path) +Stat::~Stat() { - struct stat st; - if(stat(path, st)==0) - return S_ISREG(st.st_mode); - return false; + delete priv; } -bool is_dir(const Path &path) +const std::string &Stat::get_owner() const { - struct stat st; - if(stat(path, st)==0) - return S_ISDIR(st.st_mode); - return false; + if(priv && owner_info.owner.empty()) + priv->fill_owner_info(owner_info); + return owner_info.owner; } -bool is_link(const Path &path) +const std::string &Stat::get_group() const { -#ifdef WIN32 - (void)path; -#else - struct stat st; - if(lstat(path, st)==0) - return S_ISLNK(st.st_mode); -#endif - return false; + if(priv && owner_info.group.empty()) + priv->fill_owner_info(owner_info); + return owner_info.group; } } // namespace FS