Signed-off-by: Julien CLEMENT <julien.clement@epita.fr>
This commit is contained in:
		
							parent
							
								
									40b4191d2d
								
							
						
					
					
						commit
						446aff49ef
					
				| @ -47,5 +47,5 @@ impl FDTable { | ||||
| pub trait FileDescriptor { | ||||
|     fn get_fd(&self) -> FDId; | ||||
|     async fn write(&mut self, buf: &[u8], count: usize) -> isize; | ||||
|     async fn read(&mut self, buf: &[u8], count: usize) -> isize; | ||||
|     async fn read(&mut self, buf: &mut [u8], count: usize) -> isize; | ||||
| } | ||||
|  | ||||
| @ -1,6 +1,8 @@ | ||||
| use crate::drivers::atapi::read_block; | ||||
| use crate::fd::{FDId, FDt, FileDescriptor}; | ||||
| use crate::println; | ||||
| use crate::utils::mutex::AsyncMutex; | ||||
| 
 | ||||
| use super::iso9660::{IsoDir, ISO_BLOCK_SIZE}; | ||||
| 
 | ||||
| use alloc::{boxed::Box, sync::Arc}; | ||||
| use async_trait::async_trait; | ||||
| @ -8,11 +10,19 @@ use core::cell::RefCell; | ||||
| 
 | ||||
| pub struct IsoFD { | ||||
|     pub fd: FDId, | ||||
|     offset: u32, | ||||
|     lba: u32, | ||||
|     size: u32 | ||||
| } | ||||
| 
 | ||||
| impl IsoFD { | ||||
|     pub fn new() -> FDt { | ||||
|         Arc::new(RefCell::new(IsoFD { fd: FDId::new() })) | ||||
|     pub fn new(entry: &IsoDir) -> FDt { | ||||
|         Arc::new(RefCell::new(IsoFD { | ||||
|             fd: FDId::new(), | ||||
|             offset: 0, | ||||
|             lba: entry.data_blk.le, | ||||
|             size: entry.file_size.le, | ||||
|         })) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| @ -26,8 +36,26 @@ impl FileDescriptor for IsoFD { | ||||
|         0 | ||||
|     } | ||||
| 
 | ||||
|     async fn read(&mut self, buf: &[u8], count: usize) -> isize { | ||||
|         println!("Read from fd"); | ||||
|         0 | ||||
|     #[allow(unaligned_references)] | ||||
|     async fn read(&mut self, buf: &mut [u8], count: usize) -> isize { | ||||
|         let mut block_offset = self.offset / ISO_BLOCK_SIZE; | ||||
|         let mut content = read_block(self.lba + block_offset).await; | ||||
|         let mut read: isize = 0; | ||||
|         for _ in 0..count { | ||||
|             if self.offset >= self.size { | ||||
|                 break; | ||||
|             } | ||||
| 
 | ||||
|             buf[read as usize] = content[(self.offset % ISO_BLOCK_SIZE) as usize]; | ||||
|             read += 1; | ||||
|             self.offset += 1; | ||||
| 
 | ||||
|             if self.offset % ISO_BLOCK_SIZE == 0 { | ||||
|                 block_offset += 1; | ||||
|                 content = read_block(self.lba + block_offset).await; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         read | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| pub const ISO_BLOCK_SIZE: usize = 2048; | ||||
| pub const ISO_BLOCK_SIZE: u32 = 2048; | ||||
| 
 | ||||
| // Twin values structs
 | ||||
| 
 | ||||
|  | ||||
| @ -17,6 +17,7 @@ use async_trait::async_trait; | ||||
| pub struct IsoFS {} | ||||
| 
 | ||||
| #[async_trait(?Send)] | ||||
| #[allow(unaligned_references)] | ||||
| impl FileSystem for IsoFS { | ||||
|     async fn open(&mut self, path: &str, flags: u32) -> Option<FDt> { | ||||
|         // ISO is a read only file system
 | ||||
| @ -31,12 +32,13 @@ impl FileSystem for IsoFS { | ||||
|             return None; | ||||
|         } | ||||
| 
 | ||||
|         let root: IsoDir = voldesc.root_dir; | ||||
|         let mut curr_entry_block: [u8; iso9660::ISO_BLOCK_SIZE] = read_block(root.data_blk.le).await; | ||||
|         let root: &IsoDir = &voldesc.root_dir; | ||||
|         let mut curr_entry_block: [u8; iso9660::ISO_BLOCK_SIZE as usize] = read_block(root.data_blk.le).await; | ||||
| 
 | ||||
|         let mut curr_entry: &IsoDir = unserialize(curr_entry_block.as_ptr()); | ||||
| 
 | ||||
|         let path_s: String = String::from(path); | ||||
|         let path_split: Vec<&str> = path_s.split("/").collect(); | ||||
|         let path_it = path_s | ||||
|             .split("/") | ||||
|             .filter(|p| p != &""); | ||||
| @ -44,15 +46,14 @@ impl FileSystem for IsoFS { | ||||
|         for path_component in path_it { | ||||
|             let mut found = false; | ||||
|             while curr_entry.idf_len != 0 { | ||||
|                 serial_println!("{:?}", curr_entry.idf_len); | ||||
|                 serial_println!("{:?}", alloc::str::from_utf8(curr_entry.get_idf()).unwrap()); | ||||
| 
 | ||||
|                 // Found entry
 | ||||
|                 if curr_entry.matches(path_component) { | ||||
|                     serial_println!("Found {}", path_component); | ||||
|                     found = true; | ||||
|                     curr_entry_block = read_block(curr_entry.data_blk.le).await; | ||||
|                     curr_entry = unserialize(curr_entry_block.as_ptr()); | ||||
|                     if path_component != path_split[path_split.len() - 1] { | ||||
|                         curr_entry_block = read_block(curr_entry.data_blk.le).await; | ||||
|                         curr_entry = unserialize(curr_entry_block.as_ptr()); | ||||
|                     } | ||||
|                     break; | ||||
|                 } | ||||
| 
 | ||||
| @ -64,9 +65,9 @@ impl FileSystem for IsoFS { | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         let fd = IsoFD::new(); | ||||
|         let fd = IsoFD::new(curr_entry); | ||||
|         FD_TABLE.lock().await.register_fd(fd.clone()); | ||||
|         Some(fd.clone()) | ||||
|         Some(fd) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -71,5 +71,9 @@ async fn get_file() { | ||||
|         .open("///boot/grub//grub.cfg", syscalls::io::O_RDONLY) | ||||
|         .await | ||||
|         .unwrap(); | ||||
|     fd.borrow_mut().read(&[], 0).await; | ||||
|     let mut buf: [u8; 100] = [0; 100]; | ||||
|     let read = fd.borrow_mut().read(&mut buf, 100).await; | ||||
| 
 | ||||
|     println!("{:?}", read); | ||||
|     println!("{:?}", alloc::str::from_utf8(&buf).unwrap()); | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user