mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-04 05:51:27 +12:00
fs::statfs implemented
This commit is contained in:
parent
256dfc5729
commit
f42b830ce9
3 changed files with 54 additions and 1 deletions
|
@ -102,6 +102,7 @@ static fs::error to_error(DWORD e)
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
#include <sys/statvfs.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <libgen.h>
|
#include <libgen.h>
|
||||||
|
@ -403,6 +404,45 @@ bool fs::is_dir(const std::string& path)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool fs::statfs(const std::string& path, fs::device_stat& info)
|
||||||
|
{
|
||||||
|
if (auto device = get_virtual_device(path))
|
||||||
|
{
|
||||||
|
return device->statfs(path, info);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
ULARGE_INTEGER avail_free;
|
||||||
|
ULARGE_INTEGER total_size;
|
||||||
|
ULARGE_INTEGER total_free;
|
||||||
|
|
||||||
|
if (!GetDiskFreeSpaceExW(to_wchar(path).get(), &avail_free, &total_size, &total_free))
|
||||||
|
{
|
||||||
|
g_tls_error = to_error(GetLastError());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
info.block_size = 4096; // TODO
|
||||||
|
info.total_size = total_size.QuadPart;
|
||||||
|
info.total_free = total_free.QuadPart;
|
||||||
|
info.avail_free = avail_free.QuadPart;
|
||||||
|
#else
|
||||||
|
struct ::statvfs buf;
|
||||||
|
if (!::statvfs(path.c_str(), &buf) != 0)
|
||||||
|
{
|
||||||
|
g_tls_error = to_error(errno);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
info.block_size = buf.f_frsize;
|
||||||
|
info.total_size = info.block_size * buf.f_blocks;
|
||||||
|
info.total_free = info.block_size * buf.f_bfree;
|
||||||
|
info.avail_free = info.block_size * buf.f_bavail;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool fs::create_dir(const std::string& path)
|
bool fs::create_dir(const std::string& path)
|
||||||
{
|
{
|
||||||
if (auto device = get_virtual_device(path))
|
if (auto device = get_virtual_device(path))
|
||||||
|
|
|
@ -84,12 +84,22 @@ namespace fs
|
||||||
virtual void rewind() = 0;
|
virtual void rewind() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Device information
|
||||||
|
struct device_stat
|
||||||
|
{
|
||||||
|
u64 block_size;
|
||||||
|
u64 total_size;
|
||||||
|
u64 total_free; // Total size of free space
|
||||||
|
u64 avail_free; // Free space available to unprivileged user
|
||||||
|
};
|
||||||
|
|
||||||
// Virtual device
|
// Virtual device
|
||||||
struct device_base
|
struct device_base
|
||||||
{
|
{
|
||||||
virtual ~device_base();
|
virtual ~device_base();
|
||||||
|
|
||||||
virtual bool stat(const std::string& path, stat_t& info) = 0;
|
virtual bool stat(const std::string& path, stat_t& info) = 0;
|
||||||
|
virtual bool statfs(const std::string& path, device_stat& info) = 0;
|
||||||
virtual bool remove_dir(const std::string& path) = 0;
|
virtual bool remove_dir(const std::string& path) = 0;
|
||||||
virtual bool create_dir(const std::string& path) = 0;
|
virtual bool create_dir(const std::string& path) = 0;
|
||||||
virtual bool rename(const std::string& from, const std::string& to) = 0;
|
virtual bool rename(const std::string& from, const std::string& to) = 0;
|
||||||
|
@ -122,6 +132,9 @@ namespace fs
|
||||||
// Check whether the directory exists and is NOT a file
|
// Check whether the directory exists and is NOT a file
|
||||||
bool is_dir(const std::string& path);
|
bool is_dir(const std::string& path);
|
||||||
|
|
||||||
|
// Get filesystem information
|
||||||
|
bool statfs(const std::string& path, device_stat& info);
|
||||||
|
|
||||||
// Delete empty directory
|
// Delete empty directory
|
||||||
bool remove_dir(const std::string& path);
|
bool remove_dir(const std::string& path);
|
||||||
|
|
||||||
|
|
|
@ -260,7 +260,7 @@ s32 cellFsUtime(vm::cptr<char> path, vm::cptr<CellFsUtimbuf> timep)
|
||||||
|
|
||||||
s32 cellFsGetFreeSize(vm::cptr<char> path, vm::ptr<u32> block_size, vm::ptr<u64> block_count)
|
s32 cellFsGetFreeSize(vm::cptr<char> path, vm::ptr<u32> block_size, vm::ptr<u64> block_count)
|
||||||
{
|
{
|
||||||
cellFs.warning("cellFsGetFreeSize(path=%s, block_size=*0x%x, block_count=*0x%x)", path, block_size, block_count);
|
cellFs.todo("cellFsGetFreeSize(path=%s, block_size=*0x%x, block_count=*0x%x)", path, block_size, block_count);
|
||||||
|
|
||||||
// TODO: Get real values. Currently, it always returns 40 GB of free space divided in 4 KB blocks
|
// TODO: Get real values. Currently, it always returns 40 GB of free space divided in 4 KB blocks
|
||||||
*block_size = 4096; // ?
|
*block_size = 4096; // ?
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue