diff --git a/Cargo.lock b/Cargo.lock index 985155bf52..7a4335729b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,35 +8,74 @@ version = "1.3.2" 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" + [[package]] name = "libc" -version = "0.2.147" +version = "0.2.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" [[package]] -name = "ramfs" -version = "0.1.0" -dependencies = [ - "redox-daemon", - "redox_syscall", -] - -[[package]] -name = "redox-daemon" -version = "0.1.1" +name = "libredox" +version = "0.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "811fd0d382a70c9e9192166ee794567b65ef34cc7309c86a49b071779ca9b5f3" +checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" dependencies = [ + "bitflags 2.4.1", "libc", "redox_syscall", ] [[package]] -name = "redox_syscall" -version = "0.3.5" +name = "libredox" +version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "962b650e6b934f95cec493e1464e0f5cba98dd9ba9ef2b1c42cdfdb7864cab5a" dependencies = [ - "bitflags", + "bitflags 2.4.1", + "libc", + "redox_syscall", +] + +[[package]] +name = "ramfs" +version = "0.1.0" +dependencies = [ + "libredox 0.0.3", + "redox-daemon", + "redox-scheme", + "redox_syscall", +] + +[[package]] +name = "redox-daemon" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353178b5771a301b9d2b318914ab5dfeb21dd6e65930faedde19248cfceca5a7" +dependencies = [ + "libc", + "libredox 0.0.1", +] + +[[package]] +name = "redox-scheme" +version = "0.1.0" +source = "git+https://gitlab.redox-os.org/redox-os/redox-scheme.git#afd3fa573f0a7c03b762ac23daaf06966afecc75" +dependencies = [ + "libredox 0.0.3", + "redox_syscall", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", ] diff --git a/Cargo.toml b/Cargo.toml index 3ab8a9abe7..a98c8c1c79 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,4 +10,6 @@ description = "In-memory filesystem for Redox, which is useful for early logging [dependencies] redox-daemon = "0.1.1" -redox_syscall = "0.3" +redox_syscall = "0.4.1" +redox-scheme = { git = "https://gitlab.redox-os.org/redox-os/redox-scheme.git" } +libredox = "0.0.3" diff --git a/src/filesystem.rs b/src/filesystem.rs index eb60779e71..84fe175f81 100644 --- a/src/filesystem.rs +++ b/src/filesystem.rs @@ -98,9 +98,7 @@ impl Filesystem { } } pub fn get_block_size(&self) -> Result { - let mut statvfs = StatVfs::default(); - syscall::fstatvfs(self.memory_file.as_raw_fd() as usize, &mut statvfs)?; - Ok(statvfs.f_bsize) + Ok(libredox::call::fstatvfs(self.memory_file.as_raw_fd() as usize)?.f_bsize as u32) } pub fn block_size(&self) -> u32 { self.get_block_size().unwrap_or(Self::DEFAULT_BLOCK_SIZE) diff --git a/src/main.rs b/src/main.rs index 5dd86b979e..a9b587e224 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,46 +1,32 @@ -#![feature(try_reserve)] - -use std::fs::File; -use std::io::prelude::*; -use std::{env, io, process}; - -use syscall::{Packet, SchemeMut}; +use std::{env, process}; mod filesystem; mod scheme; +use redox_scheme::SignalBehavior; + use self::scheme::Scheme; fn main() { let scheme_name = env::args().nth(1).expect("Usage:\n\tramfs SCHEME_NAME"); redox_daemon::Daemon::new(move |daemon| { - let mut socket = - File::create(format!(":{}", scheme_name)).expect("ramfs: failed to create socket"); + let socket = redox_scheme::Socket::create(&scheme_name).expect("ramfs: failed to create socket"); let mut scheme = Scheme::new(scheme_name).expect("ramfs: failed to initialize scheme"); - syscall::setrens(0, 0).expect("ramfs: failed to enter null namespace"); + libredox::call::setrens(0, 0).expect("ramfs: failed to enter null namespace"); daemon.ready().expect("ramfs: failed to mark daemon as ready"); - 'packet_loop: loop { - let mut packet = Packet::default(); + loop { + let Some(request) = socket.next_request(SignalBehavior::Restart).expect("ramfs: failed to get next scheme request") else { + break; + }; - match socket.read(&mut packet) { - Ok(0) => break 'packet_loop, - Ok(_) => (), - Err(error) if error.kind() == io::ErrorKind::Interrupted => continue 'packet_loop, - Err(error) => panic!("ramfs: failed to read from socket: {:?}", error), - } + let response = request.handle_scheme_mut(&mut scheme); - scheme.handle(&mut packet); - - match socket.write(&packet) { - Ok(_) => (), - Err(error) if error.kind() == io::ErrorKind::Interrupted => continue 'packet_loop, - Err(error) => panic!("ramfs: failed to write to socket: {:?}", error), - } + 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 fd0c2f7231..7791c707c9 100644 --- a/src/scheme.rs +++ b/src/scheme.rs @@ -4,15 +4,17 @@ use std::os::unix::io::AsRawFd; use std::{cmp, ops}; use syscall::error::{ - EACCES, EBADF, EBADFD, EEXIST, EINVAL, EIO, EISDIR, ENOENT, ENOMEM, ENOSYS, ENOTDIR, ENOTEMPTY, + EACCES, EBADF, EBADFD, EEXIST, EINVAL, EIO, EISDIR, ENOMEM, ENOSYS, ENOTDIR, ENOTEMPTY, EOVERFLOW, }; use syscall::flag::{ O_ACCMODE, O_CREAT, O_DIRECTORY, O_EXCL, O_RDONLY, O_RDWR, O_STAT, O_TRUNC, O_WRONLY, }; -use syscall::{Error, EventFlags, Map, Result, SchemeMut, Stat, StatVfs, TimeSpec}; +use syscall::{Error, EventFlags, Map, Result, Stat, StatVfs, TimeSpec}; use syscall::{MODE_DIR, MODE_FILE, MODE_PERM, MODE_TYPE, SEEK_CUR, SEEK_END, SEEK_SET}; +use redox_scheme::SchemeMut; + use crate::filesystem::{self, DirEntry, File, FileData, Filesystem}; #[derive(Clone)] @@ -475,25 +477,21 @@ impl SchemeMut for Scheme { } Err(Error::new(ENOSYS)) } - fn fmap(&mut self, fd: usize, _map: &Map) -> Result { + fn mmap_prep(&mut self, fd: usize, _offset: u64, _size: usize, _flags: syscall::MapFlags) -> Result { if !self.handles.contains_key(&fd) { return Err(Error::new(EBADF)); } // TODO Err(Error::new(ENOSYS)) } - fn funmap(&mut self, _address: usize, _len: usize) -> Result { - // TODO - Err(Error::new(ENOSYS)) - } - fn fpath(&mut self, fd: usize, buf: &mut [u8]) -> Result { + fn fpath(&mut self, fd: usize, _buf: &mut [u8]) -> Result { if !self.handles.contains_key(&fd) { return Err(Error::new(EBADF)); } // TODO Err(Error::new(ENOSYS)) } - fn frename(&mut self, fd: usize, path: &str, uid: u32, gid: u32) -> Result { + fn frename(&mut self, fd: usize, _path: &str, _uid: u32, _gid: u32) -> Result { if !self.handles.contains_key(&fd) { return Err(Error::new(EBADF)); } @@ -563,7 +561,14 @@ impl SchemeMut for Scheme { if !self.handles.contains_key(&fd) { return Err(Error::new(EBADF)); } - syscall::fstatvfs(self.filesystem.memory_file.as_raw_fd() as usize, stat)?; + let abi_stat = libredox::call::fstatvfs(self.filesystem.memory_file.as_raw_fd() as usize)?; + // TODO: From impl + *stat = StatVfs { + f_bavail: abi_stat.f_bavail, + f_bfree: abi_stat.f_bfree, + f_blocks: abi_stat.f_blocks, + f_bsize: abi_stat.f_bsize as u32, + }; Ok(0) }