diff --git a/Cargo.lock b/Cargo.lock index 7a4335729b..525c58454a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,40 +4,23 @@ version = 3 [[package]] name = "bitflags" -version = "1.3.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "libc" -version = "0.2.150" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libredox" -version = "0.0.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.4.1", - "libc", - "redox_syscall", -] - -[[package]] -name = "libredox" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "962b650e6b934f95cec493e1464e0f5cba98dd9ba9ef2b1c42cdfdb7864cab5a" -dependencies = [ - "bitflags 2.4.1", + "bitflags", "libc", "redox_syscall", ] @@ -46,7 +29,7 @@ dependencies = [ name = "ramfs" version = "0.1.0" dependencies = [ - "libredox 0.0.3", + "libredox", "redox-daemon", "redox-scheme", "redox_syscall", @@ -54,28 +37,29 @@ dependencies = [ [[package]] name = "redox-daemon" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "353178b5771a301b9d2b318914ab5dfeb21dd6e65930faedde19248cfceca5a7" +checksum = "7fbdeffdb03cf2961b211a2023e683d71f2c225ea93404da5dc34b0dc94f0341" dependencies = [ "libc", - "libredox 0.0.1", + "libredox", ] [[package]] name = "redox-scheme" -version = "0.1.0" -source = "git+https://gitlab.redox-os.org/redox-os/redox-scheme.git#afd3fa573f0a7c03b762ac23daaf06966afecc75" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a4d4161697395d7cc9b182a14a753b2ba0243dcf622e278e644c6e7f74904c1" dependencies = [ - "libredox 0.0.3", + "libredox", "redox_syscall", ] [[package]] name = "redox_syscall" -version = "0.4.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" dependencies = [ - "bitflags 1.3.2", + "bitflags", ] diff --git a/Cargo.toml b/Cargo.toml index a98c8c1c79..d5fa4b92fd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,7 @@ description = "In-memory filesystem for Redox, which is useful for early logging # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -redox-daemon = "0.1.1" -redox_syscall = "0.4.1" -redox-scheme = { git = "https://gitlab.redox-os.org/redox-os/redox-scheme.git" } -libredox = "0.0.3" +redox-daemon = "0.1.2" +redox_syscall = "0.5.1" +redox-scheme = "0.2" +libredox = "0.1.3" diff --git a/src/main.rs b/src/main.rs index a9b587e224..dd86c3d48f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,7 +3,7 @@ use std::{env, process}; mod filesystem; mod scheme; -use redox_scheme::SignalBehavior; +use redox_scheme::{RequestKind, SignalBehavior}; use self::scheme::Scheme; @@ -23,10 +23,15 @@ fn main() { let Some(request) = socket.next_request(SignalBehavior::Restart).expect("ramfs: failed to get next scheme request") else { break; }; + match request.kind() { + RequestKind::Call(call) => { + let response = call.handle_scheme_mut(&mut scheme); - let response = request.handle_scheme_mut(&mut scheme); + socket.write_responses(&[response], SignalBehavior::Restart).expect("ramfs: failed to write next scheme response"); + } + _ => (), + } - socket.write_responses(&[response], SignalBehavior::Restart).expect("ramfs: failed to write next scheme response"); } process::exit(0); diff --git a/src/scheme.rs b/src/scheme.rs index bfb1d41312..b0069bf77c 100644 --- a/src/scheme.rs +++ b/src/scheme.rs @@ -279,25 +279,6 @@ impl SchemeMut for Scheme { Ok(fd) } - fn chmod(&mut self, path: &str, mode: u16, uid: u32, gid: u32) -> Result { - let inode_num = self.filesystem.resolve(path.as_bytes(), uid, gid)?; - let inode = self - .filesystem - .files - .get_mut(&inode_num) - .ok_or(Error::new(EIO))?; - - let cur_mode = inode.mode & MODE_TYPE; - - if inode.uid != uid && uid != 0 { - return Err(Error::new(EACCES)); - } - if mode & MODE_TYPE != 0 { - return Err(Error::new(EINVAL)); - } - inode.mode = mode | cur_mode; - Ok(0) - } fn rmdir(&mut self, path: &str, uid: u32, gid: u32) -> Result { self.remove_dentry(path.as_bytes(), uid, gid, true) } @@ -400,12 +381,15 @@ impl SchemeMut for Scheme { } // if there's a seek hole, fill it with 0 and continue writing. - if handle.offset > bytes.len() { - let additional = handle.offset - bytes.len(); + let end_off = handle.offset.checked_add(buf.len()).ok_or(Error::new(EOVERFLOW))?; + if end_off > bytes.len() { + let additional = end_off - bytes.len(); bytes.try_reserve(additional).or(Err(Error::new(ENOMEM)))?; - bytes.resize(handle.offset, 0u8); + bytes.resize(end_off, 0u8); } - bytes.extend(buf); + bytes[handle.offset..][..buf.len()].copy_from_slice(buf); + handle.offset = end_off; + Ok(buf.len()) } else { Err(Error::new(EISDIR)) @@ -419,7 +403,6 @@ impl SchemeMut for Scheme { .get_mut(&handle.inode) .ok_or(Error::new(EBADFD))?; - let old = handle.offset; handle.offset = match whence { SEEK_SET => cmp::max(0, pos), SEEK_CUR => cmp::max( @@ -444,9 +427,11 @@ impl SchemeMut for Scheme { let cur_type = file.mode & MODE_TYPE; + /* if mode & MODE_TYPE != 0 { return Err(Error::new(EINVAL)); } + */ file.mode = mode | cur_type;