This commit is contained in:
pjht 2024-08-06 19:43:26 -05:00
parent 6386665f34
commit a5639f879e
Signed by: pjht
GPG Key ID: 7B5F6AFBEC7EE78E

View File

@ -1,7 +1,12 @@
use std::{fs::File, io::{Read, Seek}, os::mikros::{ipc, syscalls}, path::PathBuf, sync::Arc, usize};
use std::{
fs::File,
io::{Read, Seek},
os::mikros::{ipc, syscalls},
path::PathBuf,
sync::Arc,
};
use parking_lot::RwLock;
use syslog_rpc::{BinaryMessage, Message};
use tar::Archive;
#[derive(Clone)]
@ -14,12 +19,16 @@ impl fs_rpc::Server for Serv {
fn mount(&self, dev: &std::path::Path) -> Result<u64, ()> {
let archive = File::open(dev).map_err(|_| ())?;
let mut archive = Archive::new(archive);
let entries = archive.entries_with_seek().unwrap().map(|entry| {
let entries = archive
.entries_with_seek()
.unwrap()
.map(|entry| {
let entry = entry.unwrap();
let path = entry.path().unwrap().into_owned();
let file_offset = entry.raw_file_position();
(path, file_offset, entry.size() as usize)
}).collect();
})
.collect();
self.mounts.write().push((archive.into_inner(), entries));
Ok((self.mounts.read().len() - 1) as u64)
}
@ -27,8 +36,15 @@ impl fs_rpc::Server for Serv {
fn open(&self, path: &std::path::Path, mount_id: u64) -> Result<(Option<u64>, u64), ()> {
let mounts = self.mounts.read();
let mount = &mounts[mount_id as usize];
let (&file_offset, &file_size) = mount.1.iter().find(|(entry_path, _offset, _size)| entry_path == path).map(|(_x, y, z)| (y, z)).ok_or(())?;
self.files.write().push((mount_id as usize, file_offset, file_size));
let (&file_offset, &file_size) = mount
.1
.iter()
.find(|(entry_path, _offset, _size)| entry_path == path)
.map(|(_x, y, z)| (y, z))
.ok_or(())?;
self.files
.write()
.push((mount_id as usize, file_offset, file_size));
Ok((None, (self.files.read().len() - 1) as u64))
}
}
@ -41,10 +57,12 @@ impl file_rpc::Server for Serv {
return Ok(Vec::new());
};
let mounts = self.mounts.read();
let mount = &mounts[mount_id as usize];
(&mount.0).seek(std::io::SeekFrom::Start(file_offset + pos)).unwrap();
let mount = &mounts[mount_id];
(&mount.0)
.seek(std::io::SeekFrom::Start(file_offset + pos))
.unwrap();
let mut buf = vec![0; read_len];
let read_bytes = (&mount.0).read(&mut buf).map_err(|_| ()) ?;
let read_bytes = (&mount.0).read(&mut buf).map_err(|_| ())?;
buf.truncate(read_bytes);
Ok(buf)
}
@ -83,14 +101,14 @@ fn main() {
break;
}
}
syslog_rpc::Client::new(syslog_pid).send_message(Message {
from: "tarfs".to_string(),
text: Some("Tar archive fs initialized".to_string()),
binary: Some(BinaryMessage {
kind: 0,
data: vec![],
}),
}).unwrap();
syslog_rpc::Client::new(syslog_pid)
.send_text_binary_message(
"tarfs".to_string(),
"Tar archive fs initialized".to_string(),
0,
[],
)
.unwrap();
loop {
ipc::process_messages()
}