working on ISO fs open
All checks were successful
continuous-integration/drone/push Build is passing

Signed-off-by: Julien CLEMENT <julien.clement@epita.fr>
This commit is contained in:
Julien CLEMENT 2022-12-24 16:49:35 +01:00
parent 43eec9621c
commit 91095b7d08
6 changed files with 42 additions and 22 deletions

@ -58,8 +58,7 @@ static ATAPI_SIG: [u8; 4] = [
];
lazy_static! {
pub static ref DRIVE: AsyncMutex<Option<ATABus>> =
{ AsyncMutex::new(ATABus::discover_atapi_drive()) };
pub static ref DRIVE: AsyncMutex<Option<ATABus>> = AsyncMutex::new(ATABus::discover_atapi_drive());
}
pub async fn init() {

@ -9,7 +9,7 @@ use lazy_static::lazy_static;
pub type FDt = Arc<RefCell<dyn FileDescriptor>>;
lazy_static! {
pub static ref FD_TABLE: AsyncMutex<FDTable> = { AsyncMutex::new(FDTable::new()) };
pub static ref FD_TABLE: AsyncMutex<FDTable> = AsyncMutex::new(FDTable::new());
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]

@ -5,15 +5,15 @@ const ISO_BLOCK_SIZE: usize = 2048;
#[repr(C, packed)]
#[derive(Copy, Clone)]
pub struct MultiEndian32 {
le: u32, // Little endian value
be: u32, // Big endian value
pub le: u32, // Little endian value
pub be: u32, // Big endian value
}
#[repr(C, packed)]
#[derive(Copy, Clone)]
pub struct MultiEndian16 {
le: u16, // Little endian value
be: u16, // Big endian value
pub le: u16, // Little endian value
pub be: u16, // Big endian value
}
// Path table structure
@ -41,7 +41,7 @@ const ISO_DATE_LEN: usize = 7;
#[repr(u8)]
#[derive(Copy, Clone)]
enum IsoFileType {
pub enum IsoFileType {
HIDDEN = 0x1, // Hidden file
ISDIR = 0x2, // Directory
ASSOCIAT = 0x4, // Associated
@ -53,20 +53,20 @@ enum IsoFileType {
#[repr(C, packed)]
#[derive(Copy, Clone)]
pub struct IsoDir {
dir_size: u8, // Length of directory record
ext_size: u8, // Length of extended attribute record
data_blk: MultiEndian32, // File data block index
file_size: MultiEndian32, // File size
date: [u8; ISO_DATE_LEN],
file_type: IsoFileType,
pub dir_size: u8, // Length of directory record
pub ext_size: u8, // Length of extended attribute record
pub data_blk: MultiEndian32, // File data block index
pub file_size: MultiEndian32, // File size
pub date: [u8; ISO_DATE_LEN],
pub file_type: IsoFileType,
unit_size: u8,
gap_size: u8,
pub unit_size: u8,
pub gap_size: u8,
vol_seq: MultiEndian16,
pub vol_seq: MultiEndian16,
idf_len: u8, // File name length
idf: [u8; 0], // File name
pub idf_len: u8, // File name length
pub idf: [u8; 0], // File name
}
impl IsoDir {

@ -10,7 +10,7 @@ use super::FileSystem;
use fd::IsoFD;
use iso9660::{IsoDir, IsoPrimVolDesc};
use alloc::{boxed::Box, sync::Arc};
use alloc::{boxed::Box, sync::Arc, string::String, vec::Vec};
use async_trait::async_trait;
pub struct IsoFS {}
@ -18,16 +18,37 @@ pub struct IsoFS {}
#[async_trait(?Send)]
impl FileSystem for IsoFS {
async fn open(&mut self, path: &str, flags: u32) -> Option<FDt> {
// ISO is a read only file system
if flags != crate::syscalls::io::O_RDONLY {
return None;
}
let voldesc = get_prim_vol_desc().await;
// Invalid ISO
if voldesc.std_identifier != "CD001".as_bytes() {
return None;
}
let root: IsoDir = voldesc.root_dir;
let curr_entry_block: [u8; 2048] = DRIVE
.lock()
.await
.as_mut()
.unwrap()
.read_block(root.data_blk.le)
.await;
let curr_entry: &IsoDir = unserialize(curr_entry_block.as_ptr());
let path_s: String = String::from(path);
let split_path: Vec<&str> = path_s
.split("/")
.filter(|p| p != &"")
.collect();
println!("{:?}", split_path);
let fd = IsoFD::new();
FD_TABLE.lock().await.register_fd(fd.clone());
Some(fd.clone())

@ -11,7 +11,7 @@ use lazy_static::lazy_static;
pub type FSt = Arc<RefCell<dyn FileSystem>>;
lazy_static! {
pub static ref VIRTUAL_FS: AsyncMutex<VirtualFS> = { AsyncMutex::new(VirtualFS::new()) };
pub static ref VIRTUAL_FS: AsyncMutex<VirtualFS> = AsyncMutex::new(VirtualFS::new());
}
#[async_trait(?Send)]

@ -68,7 +68,7 @@ async fn get_file() {
let fd = fs::VIRTUAL_FS
.lock()
.await
.open("test", syscalls::io::O_RDONLY)
.open("///boot///grub.cfg", syscalls::io::O_RDONLY)
.await
.unwrap();
fd.borrow_mut().read(&[], 0).await;