cellFs: Improve cellFsGetDirectoryEntries

This commit is contained in:
Eladash 2020-01-03 22:29:39 +02:00 committed by Ivan
parent 28fb0d1741
commit 9d2c9e5d62

View File

@ -639,7 +639,9 @@ error_code sys_fs_stat(ppu_thread& ppu, vm::cptr<char> path, vm::ptr<CellFsStat>
const std::string_view vpath = path.get_ptr();
const std::string local_path = vfs::get(vpath);
if (vpath.find_first_not_of('/') == -1)
const auto first_name_ch = vpath.find_first_not_of('/');
if (first_name_ch == -1)
{
*sb = {CELL_FS_S_IFDIR | 0444};
return CELL_OK;
@ -693,9 +695,10 @@ error_code sys_fs_stat(ppu_thread& ppu, vm::cptr<char> path, vm::ptr<CellFsStat>
}
}
const bool supports_id = vpath.size() < (first_name_ch + 8) || !vpath.compare(first_name_ch, 8, "dev_hdd1"sv); // TODO
sb->mode = info.is_directory ? CELL_FS_S_IFDIR | 0777 : CELL_FS_S_IFREG | 0666;
sb->uid = 0; // Always zero
sb->gid = 0; // Always zero
sb->uid = supports_id ? 0 : -1;
sb->gid = supports_id ? 0 : -1;
sb->atime = info.atime;
sb->mtime = info.mtime;
sb->ctime = info.ctime;
@ -727,9 +730,10 @@ error_code sys_fs_fstat(ppu_thread& ppu, u32 fd, vm::ptr<CellFsStat> sb)
const fs::stat_t& info = file->file.stat();
const bool supports_id = std::memcmp("/dev_hdd1", file->name.data(), 9) != 0; // TODO
sb->mode = info.is_directory ? CELL_FS_S_IFDIR | 0777 : CELL_FS_S_IFREG | 0666;
sb->uid = 0; // Always zero
sb->gid = 0; // Always zero
sb->uid = supports_id ? 0 : -1;
sb->gid = supports_id ? 0 : -1;
sb->atime = info.atime;
sb->mtime = info.mtime;
sb->ctime = info.ctime; // ctime may be incorrect
@ -1218,15 +1222,21 @@ error_code sys_fs_fcntl(ppu_thread& ppu, u32 fd, u32 op, vm::ptr<void> _arg, u32
return CELL_EBADF;
}
for (; arg->_size < arg->max; arg->_size++)
arg->_size = 0; // This write is not really useful for cellFs but do it anyways
// NOTE: This function is actually capable of reading only one entry at a time
if (arg->max)
{
std::memset(arg->ptr.get_ptr(), 0, arg->max * arg->ptr.size());
if (auto* info = directory->dir_read())
{
auto& entry = arg->ptr[arg->_size];
auto& entry = arg->ptr[arg->_size++];
const bool supports_id = std::memcmp("/dev_hdd1", directory->name.data(), 9) != 0; // TODO
entry.attribute.mode = info->is_directory ? CELL_FS_S_IFDIR | 0777 : CELL_FS_S_IFREG | 0666;
entry.attribute.uid = 0;
entry.attribute.gid = 0;
entry.attribute.uid = supports_id ? 0 : -1;
entry.attribute.gid = supports_id ? 0 : -1;
entry.attribute.atime = info->atime;
entry.attribute.mtime = info->mtime;
entry.attribute.ctime = info->ctime;
@ -1237,10 +1247,6 @@ error_code sys_fs_fcntl(ppu_thread& ppu, u32 fd, u32 op, vm::ptr<void> _arg, u32
entry.entry_name.d_namlen = u8(std::min<size_t>(info->name.size(), CELL_FS_MAX_FS_FILE_NAME_LENGTH));
strcpy_trunc(entry.entry_name.d_name, info->name);
}
else
{
break;
}
}
arg->_code = CELL_OK;