forked from Bananymous/banan-os
Kernel: Implement TmpFS directory listing
This commit is contained in:
parent
cbb2c37e00
commit
639fd8804c
|
@ -276,9 +276,51 @@ namespace Kernel
|
||||||
return BAN::RefPtr<Inode>(inode);
|
return BAN::RefPtr<Inode>(inode);
|
||||||
}
|
}
|
||||||
|
|
||||||
BAN::ErrorOr<void> TmpDirectoryInode::list_next_inodes_impl(off_t, DirectoryEntryList*, size_t)
|
BAN::ErrorOr<void> TmpDirectoryInode::list_next_inodes_impl(off_t data_block_index, DirectoryEntryList* list, size_t list_len)
|
||||||
{
|
{
|
||||||
return BAN::Error::from_errno(ENOTSUP);
|
if (list_len < (size_t)blksize())
|
||||||
|
{
|
||||||
|
dprintln("buffer is too small");
|
||||||
|
return BAN::Error::from_errno(ENOBUFS);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto block_index = this->block_index(data_block_index);
|
||||||
|
|
||||||
|
list->entry_count = 0;
|
||||||
|
|
||||||
|
// if we reach a non-allocated block, it marks the end
|
||||||
|
if (!block_index.has_value())
|
||||||
|
return {};
|
||||||
|
|
||||||
|
auto* dirp = list->array;
|
||||||
|
|
||||||
|
const size_t byte_count = BAN::Math::min<size_t>(size() - data_block_index * blksize(), blksize());
|
||||||
|
m_fs.with_block_buffer(block_index.value(), [&](BAN::ByteSpan bytespan) {
|
||||||
|
bytespan = bytespan.slice(0, byte_count);
|
||||||
|
|
||||||
|
while (bytespan.size() > 0)
|
||||||
|
{
|
||||||
|
const auto& entry = bytespan.as<TmpDirectoryEntry>();
|
||||||
|
|
||||||
|
if (entry.type != DT_UNKNOWN)
|
||||||
|
{
|
||||||
|
// TODO: dirents should be aligned
|
||||||
|
|
||||||
|
dirp->dirent.d_ino = entry.ino;
|
||||||
|
dirp->dirent.d_type = entry.type;
|
||||||
|
strncpy(dirp->dirent.d_name, entry.name, entry.name_len);
|
||||||
|
dirp->dirent.d_name[entry.name_len] = '\0';
|
||||||
|
dirp->rec_len = sizeof(DirectoryEntry) + entry.name_len + 1;
|
||||||
|
dirp = dirp->next();
|
||||||
|
|
||||||
|
list->entry_count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
bytespan = bytespan.slice(entry.rec_len);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
BAN::ErrorOr<void> TmpDirectoryInode::create_file_impl(BAN::StringView name, mode_t mode, uid_t uid, gid_t gid)
|
BAN::ErrorOr<void> TmpDirectoryInode::create_file_impl(BAN::StringView name, mode_t mode, uid_t uid, gid_t gid)
|
||||||
|
|
Loading…
Reference in New Issue