From 0fe6bbcee21e90d1b5c0a8264acb234c6fbcf7fe Mon Sep 17 00:00:00 2001 From: 4lDO2 <4lDO2@protonmail.com> Date: Wed, 11 Sep 2024 21:57:39 +0200 Subject: [PATCH] Implement getdents --- Cargo.lock | 24 ++++++++++---------- Cargo.toml | 2 +- src/initfs.rs | 62 +++++++++++++++++++++++++-------------------------- 3 files changed, 43 insertions(+), 45 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fde8798a56..a92562a7a2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -50,9 +50,9 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "libc" -version = "0.2.155" +version = "0.2.158" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" [[package]] name = "libredox" @@ -107,9 +107,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.36" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -117,7 +117,7 @@ dependencies = [ [[package]] name = "redox-initfs" version = "0.1.0" -source = "git+https://gitlab.redox-os.org/redox-os/redox-initfs.git#7dd9b2e84d983a444518218f3ec74d3e9ac900b3" +source = "git+https://gitlab.redox-os.org/redox-os/redox-initfs.git#65cf406b7d4c5befc38b79696cdeb317bf06ed62" dependencies = [ "plain", ] @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "redox-scheme" version = "0.2.1" -source = "git+https://gitlab.redox-os.org/redox-os/redox-scheme.git#79d9d54f572f53386981fb9b6ef054fd9e45110c" +source = "git+https://gitlab.redox-os.org/redox-os/redox-scheme.git#67c75441660e11280a97396714c0df3e677119bc" dependencies = [ "libredox", "redox_syscall", @@ -145,9 +145,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +checksum = "0884ad60e090bf1345b93da0a5de8923c93884cd03f40dfcfddd3b4bee661853" dependencies = [ "bitflags", ] @@ -189,9 +189,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.71" +version = "2.0.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b146dcf730474b4bcd16c311627b31ede9ab149045db4d6088b3becaea046462" +checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" dependencies = [ "proc-macro2", "quote", @@ -200,6 +200,6 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" diff --git a/Cargo.toml b/Cargo.toml index 87c558457e..1a533d48b5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ crate-type = ["staticlib"] hashbrown = { version = "0.14", default-features = false, features = ["inline-more"] } linked_list_allocator = "0.10" redox-initfs = { git = "https://gitlab.redox-os.org/redox-os/redox-initfs.git", default-features = false } -redox_syscall = "0.5.3" +redox_syscall = "0.5.4" redox-scheme = { git = "https://gitlab.redox-os.org/redox-os/redox-scheme.git" } redox-rt = { git = "https://gitlab.redox-os.org/redox-os/relibc.git", rev = "e97f26c7" } diff --git a/src/initfs.rs b/src/initfs.rs index 81384df4c7..48389949dd 100644 --- a/src/initfs.rs +++ b/src/initfs.rs @@ -17,6 +17,9 @@ use redox_scheme::SignalBehavior; use redox_scheme::Socket; use redox_scheme::V2; use syscall::data::Stat; +use syscall::dirent::DirEntry; +use syscall::dirent::DirentBuf; +use syscall::dirent::DirentKind; use syscall::error::*; use syscall::flag::*; use syscall::schemev2::NewFdFlags; @@ -147,7 +150,7 @@ impl SchemeMut for InitFsScheme { Ok(OpenResult::ThisScheme { number: id, flags: NewFdFlags::POSITIONED }) } - fn read(&mut self, id: usize, mut buffer: &mut [u8], offset: u64, _fcntl_flags: u32) -> Result { + fn read(&mut self, id: usize, buffer: &mut [u8], offset: u64, _fcntl_flags: u32) -> Result { let Ok(offset) = usize::try_from(offset) else { return Ok(0); }; @@ -155,35 +158,6 @@ impl SchemeMut for InitFsScheme { let handle = self.handles.get_mut(&id).ok_or(Error::new(EBADF))?; match Self::get_inode(&self.fs, handle.inode)?.kind() { - InodeKind::Dir(dir) => { - let mut bytes_read = 0; - let mut total_to_skip = offset; - - for entry_res in (Iter { dir, idx: 0 }) { - let entry = entry_res?; - let name = entry.name().map_err(|_| Error::new(EIO))?; - - let to_skip = core::cmp::min(total_to_skip, name.len() + 1); - if to_skip == name.len() + 1 { continue; } - - let name = &name[to_skip..]; - - let to_copy = core::cmp::min(name.len(), buffer.len()); - buffer[..to_copy].copy_from_slice(&name[..to_copy]); - bytes_read += to_copy; - buffer = &mut buffer[to_copy..]; - - if !buffer.is_empty() { - buffer[0] = b'\n'; - bytes_read += 1; - buffer = &mut buffer[1..]; - } - - total_to_skip -= to_skip; - } - - Ok(bytes_read) - } InodeKind::File(file) => { let data = file.data().map_err(|_| Error::new(EIO))?; let src_buf = &data[core::cmp::min(offset, data.len())..]; @@ -193,9 +167,33 @@ impl SchemeMut for InitFsScheme { Ok(to_copy) } - InodeKind::Unknown => return Err(Error::new(EIO)), + InodeKind::Dir(_) => Err(Error::new(EISDIR)), + InodeKind::Unknown => Err(Error::new(EIO)), } } + fn getdents<'buf>(&mut self, id: usize, mut buf: DirentBuf<&'buf mut [u8]>, opaque_offset: u64) -> Result> { + let Ok(offset) = u32::try_from(opaque_offset) else { + return Ok(buf); + }; + let handle = self.handles.get(&id).ok_or(Error::new(EBADF))?; + let InodeKind::Dir(dir) = Self::get_inode(&self.fs, handle.inode)?.kind() else { + return Err(Error::new(ENOTDIR)); + }; + let iter = Iter { dir, idx: offset }; + for (index, entry) in iter.enumerate() { + let entry = entry?; + buf.entry(DirEntry { + // TODO: Add getter + //inode: entry.inode(), + inode: 0, + + name: entry.name().ok().and_then(|utf8| core::str::from_utf8(utf8).ok()).ok_or(Error::new(EIO))?, + next_opaque_id: index as u64 + 1, + kind: DirentKind::Unspecified, + })?; + } + Ok(buf) + } fn fsize(&mut self, id: usize) -> Result { let handle = self.handles.get_mut(&id).ok_or(Error::new(EBADF))?; @@ -213,7 +211,7 @@ impl SchemeMut for InitFsScheme { let handle = self.handles.get(&id).ok_or(Error::new(EBADF))?; // TODO: Copy scheme part in kernel - let scheme_path = b"initfs:"; + let scheme_path = b"/scheme/initfs"; let scheme_bytes = core::cmp::min(scheme_path.len(), buf.len()); buf[..scheme_bytes].copy_from_slice(&scheme_path[..scheme_bytes]);