X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Ffs%2Fstat.cpp;h=716a7d6a4f82707587aed2a9b452aa4bde87715c;hp=245dd4ea9e05e4510768343ad8a5ff62a066313f;hb=5a006c4fce0893b63f881a6c9ecd010f15770428;hpb=e240e074ce15c17d644e378067c2941aefcd5611 diff --git a/source/fs/stat.cpp b/source/fs/stat.cpp index 245dd4e..716a7d6 100644 --- a/source/fs/stat.cpp +++ b/source/fs/stat.cpp @@ -2,6 +2,8 @@ #include #include #else +#define _FILE_OFFSET_BITS 64 +#include #include #include #include @@ -45,6 +47,7 @@ struct Stat::Private Stat Stat::Private::from_struct_stat(const struct stat &st) { Stat result; + result.exists = true; if(S_ISREG(st.st_mode)) result.type = REGULAR; else if(S_ISDIR(st.st_mode)) @@ -78,6 +81,7 @@ Stat Stat::Private::from_struct_stat(const struct stat &st) #endif Stat::Stat(): + exists(false), type(UNKNOWN), size(0), alloc_size(0) @@ -87,7 +91,7 @@ Stat Stat::stat(const Path &path) { #ifdef WIN32 HANDLE handle; - handle = CreateFile(path.str().c_str(), 0, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); + handle = CreateFile(path.str().c_str(), 0, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); if(handle==INVALID_HANDLE_VALUE) throw system_error("CreateFile"); @@ -109,16 +113,18 @@ Stat Stat::stat(const Path &path) result.mtime = Time::TimeStamp(Time::filetime_to_rawtime(info.ftLastWriteTime)); PSECURITY_DESCRIPTOR sec_desc; - PSID owner; - PSID group; + PSID owner = 0; + PSID group = 0; if(!GetSecurityInfo(handle, SE_FILE_OBJECT, OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION, &owner, &group, 0, 0, &sec_desc)) { CloseHandle(handle); throw system_error("GetSecurityInfo"); } - result.owner = get_account_name(owner); - result.group = get_account_name(group); + if(owner) + result.owner = get_account_name(owner); + if(group) + result.group = get_account_name(group); LocalFree(sec_desc); @@ -129,7 +135,12 @@ Stat Stat::stat(const Path &path) struct stat st; int ret = ::stat(path.str().c_str(), &st); if(ret==-1) - throw system_error("stat"); + { + if(errno==ENOENT) + return Stat(); + else + throw system_error("stat"); + } return Private::from_struct_stat(st); #endif @@ -143,7 +154,12 @@ Stat Stat::lstat(const Path &path) struct stat st; int ret = ::lstat(path.str().c_str(), &st); if(ret==-1) - throw system_error("lstat"); + { + if(errno==ENOENT) + return Stat(); + else + throw system_error("lstat"); + } return Private::from_struct_stat(st); #endif