Implement seeking
This commit is contained in:
parent
41d6526cf8
commit
a451b4506b
4
Cargo.lock
generated
4
Cargo.lock
generated
@ -69,6 +69,9 @@ name = "bitflags"
|
|||||||
version = "2.6.0"
|
version = "2.6.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
|
checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "byteorder"
|
name = "byteorder"
|
||||||
@ -214,6 +217,7 @@ checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced"
|
|||||||
name = "file_rpc"
|
name = "file_rpc"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"bitflags",
|
||||||
"parking_lot",
|
"parking_lot",
|
||||||
"postcard",
|
"postcard",
|
||||||
"serde",
|
"serde",
|
||||||
|
53
src/main.rs
53
src/main.rs
@ -36,7 +36,7 @@ use std::{
|
|||||||
|
|
||||||
use hba::Hba;
|
use hba::Hba;
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use parking_lot::Mutex;
|
use parking_lot::{Mutex, RwLock};
|
||||||
use port::DeviceEnum;
|
use port::DeviceEnum;
|
||||||
use x86_64::structures::paging::PageTableFlags;
|
use x86_64::structures::paging::PageTableFlags;
|
||||||
|
|
||||||
@ -44,29 +44,35 @@ use x86_64::structures::paging::PageTableFlags;
|
|||||||
struct AhciState {
|
struct AhciState {
|
||||||
hba: Arc<Mutex<Hba>>,
|
hba: Arc<Mutex<Hba>>,
|
||||||
dev_port_map: Arc<HashMap<PathBuf, usize>>,
|
dev_port_map: Arc<HashMap<PathBuf, usize>>,
|
||||||
|
files: Arc<RwLock<Vec<(usize, u64)>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl dev_driver_rpc::Server for AhciState {
|
impl dev_driver_rpc::Server for AhciState {
|
||||||
fn open(&self, path: &Path) -> Result<u64, ()> {
|
fn open(&self, path: &Path) -> Result<u64, ()> {
|
||||||
Ok(*self.dev_port_map.get(path).ok_or(())? as u64)
|
let port = *self.dev_port_map.get(path).ok_or(())?;
|
||||||
|
let mut files = self.files.write();
|
||||||
|
files.push((port, 0));
|
||||||
|
Ok((files.len() - 1) as u64)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl file_rpc::Server for AhciState {
|
impl file_rpc::Server for AhciState {
|
||||||
#[allow(clippy::significant_drop_tightening)]
|
#[allow(clippy::significant_drop_tightening)]
|
||||||
fn read(&self, fd: u64, pos: u64, len: usize) -> Result<std::borrow::Cow<'_, [u8]>, ()> {
|
fn read(&self, fd: u64, len: usize) -> Result<std::borrow::Cow<'_, [u8]>, ()> {
|
||||||
let hba = self.hba.lock();
|
let hba = self.hba.lock();
|
||||||
let port = hba.ports().get(fd as usize).ok_or(())?;
|
let (port_no, pos) = self.files.read()[fd as usize];
|
||||||
|
let port = hba.ports().get(port_no).ok_or(())?;
|
||||||
let device = port.get_device().map_err(|_| ())?.ok_or(())?;
|
let device = port.get_device().map_err(|_| ())?.ok_or(())?;
|
||||||
let DeviceEnum::Ata(device) = device else {
|
let DeviceEnum::Ata(device) = device else {
|
||||||
return Err(());
|
return Err(());
|
||||||
};
|
};
|
||||||
let mut buf = vec![0; len];
|
let mut buf = vec![0; len];
|
||||||
device.read(pos as usize, &mut buf).map_err(|_| ())?;
|
device.read(pos as usize, &mut buf).map_err(|_| ())?;
|
||||||
|
self.files.write()[fd as usize].1 += len as u64;
|
||||||
Ok(buf.into())
|
Ok(buf.into())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write(&self, _fd: u64, _pos: u64, _data: &[u8]) -> Result<(), ()> {
|
fn write(&self, _fd: u64, _data: &[u8]) -> Result<(), ()> {
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,7 +90,41 @@ impl file_rpc::Server for AhciState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn dup(&self, fd: u64) -> Option<u64> {
|
fn dup(&self, fd: u64) -> Option<u64> {
|
||||||
Some(fd)
|
let mut files = self.files.write();
|
||||||
|
let file = files[fd as usize].clone();
|
||||||
|
files.push(file);
|
||||||
|
Some((files.len() - 1) as u64)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(clippy::significant_drop_tightening)]
|
||||||
|
fn seek(&self, fd: u64, pos: file_rpc::SeekFrom) -> u64 {
|
||||||
|
let mut files = self.files.write();
|
||||||
|
let file = &mut files[fd as usize];
|
||||||
|
match pos {
|
||||||
|
file_rpc::SeekFrom::Start(offset) => {
|
||||||
|
file.1 = offset;
|
||||||
|
},
|
||||||
|
file_rpc::SeekFrom::End(_offset) => {
|
||||||
|
todo!();
|
||||||
|
//if offset <= 0 {
|
||||||
|
// file.1 = file.len as u64 - (-offset) as u64;
|
||||||
|
//}
|
||||||
|
},
|
||||||
|
file_rpc::SeekFrom::Current(offset) => {
|
||||||
|
if offset > 0 {
|
||||||
|
//file.1 = u64::min(file.1 + offset as u64, file.len as u64);
|
||||||
|
file.1 += offset as u64;
|
||||||
|
} else {
|
||||||
|
let offset = (-offset) as u64;
|
||||||
|
if offset > file.1 {
|
||||||
|
file.1 = 0;
|
||||||
|
} else {
|
||||||
|
file.1 -= offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
file.1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -202,6 +242,7 @@ fn main() {
|
|||||||
let state = AhciState {
|
let state = AhciState {
|
||||||
hba: Arc::new(Mutex::new(hba)),
|
hba: Arc::new(Mutex::new(hba)),
|
||||||
dev_port_map: Arc::new(dev_port_map.clone()),
|
dev_port_map: Arc::new(dev_port_map.clone()),
|
||||||
|
files: Arc::new(RwLock::new(Vec::new())),
|
||||||
};
|
};
|
||||||
|
|
||||||
dev_driver_rpc::register_server(Box::new(state.clone()));
|
dev_driver_rpc::register_server(Box::new(state.clone()));
|
||||||
|
Loading…
Reference in New Issue
Block a user