Migrate to libredox and redox-scheme.

This commit is contained in:
4lDO2
2023-11-15 21:32:12 +01:00
parent 5ce5de2db5
commit 83a73ca48e
5 changed files with 86 additions and 56 deletions
Generated
+56 -17
View File
@@ -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",
]
+3 -1
View File
@@ -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"
+1 -3
View File
@@ -98,9 +98,7 @@ impl Filesystem {
}
}
pub fn get_block_size(&self) -> Result<u32> {
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)
+11 -25
View File
@@ -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);
+15 -10
View File
@@ -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<usize> {
fn mmap_prep(&mut self, fd: usize, _offset: u64, _size: usize, _flags: syscall::MapFlags) -> Result<usize> {
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<usize> {
// TODO
Err(Error::new(ENOSYS))
}
fn fpath(&mut self, fd: usize, buf: &mut [u8]) -> Result<usize> {
fn fpath(&mut self, fd: usize, _buf: &mut [u8]) -> Result<usize> {
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<usize> {
fn frename(&mut self, fd: usize, _path: &str, _uid: u32, _gid: u32) -> Result<usize> {
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)
}