add close and better fd assign
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				continuous-integration/drone/push Build is passing
				
			
		
		
	
	
				
					
				
			
		
			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:
		
							parent
							
								
									446aff49ef
								
							
						
					
					
						commit
						eb5a3a6635
					
				| @ -4,6 +4,7 @@ use crate::utils::AsyncMutex; | ||||
| use alloc::{boxed::Box, collections::BTreeMap, sync::Arc}; | ||||
| use async_trait::async_trait; | ||||
| use core::cell::RefCell; | ||||
| use core::sync::atomic::{AtomicU32, Ordering}; | ||||
| use lazy_static::lazy_static; | ||||
| 
 | ||||
| pub type FDt = Arc<RefCell<dyn FileDescriptor>>; | ||||
| @ -13,12 +14,13 @@ lazy_static! { | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] | ||||
| pub struct FDId(u64); | ||||
| pub struct FDId(u32); | ||||
| 
 | ||||
| impl FDId { | ||||
|     pub fn new() -> Self { | ||||
|         // TODO: search for first available fd
 | ||||
|         FDId(1) | ||||
|         static NEXT_ID: AtomicU32 = AtomicU32::new(0); | ||||
|         FDId(NEXT_ID.fetch_add(1, Ordering::Relaxed)) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| @ -33,12 +35,19 @@ impl FDTable { | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     pub fn unregister_fd(&mut self, fd: FDt) { | ||||
|         self.table.remove(&fd.borrow().get_fd()); | ||||
|         println!( | ||||
|             "Unregistered fd: {:?}", | ||||
|             fd.borrow().get_fd() | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     pub fn register_fd(&mut self, fd: FDt) { | ||||
|         // TODO
 | ||||
|         self.table.insert(fd.borrow().get_fd(), fd.clone()); | ||||
|         println!( | ||||
|             "Registered fd: {:?}", | ||||
|             self.table.get(&FDId(1)).unwrap().borrow().get_fd() | ||||
|             self.table.get(&FDId(0)).unwrap().borrow().get_fd() | ||||
|         ); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -1,6 +1,5 @@ | ||||
| use crate::drivers::atapi::read_block; | ||||
| use crate::fd::{FDId, FDt, FileDescriptor}; | ||||
| use crate::println; | ||||
| use crate::fd::{FDId, FDt, FileDescriptor, FD_TABLE}; | ||||
| 
 | ||||
| use super::iso9660::{IsoDir, ISO_BLOCK_SIZE}; | ||||
| 
 | ||||
| @ -16,13 +15,16 @@ pub struct IsoFD { | ||||
| } | ||||
| 
 | ||||
| impl IsoFD { | ||||
|     pub fn new(entry: &IsoDir) -> FDt { | ||||
|         Arc::new(RefCell::new(IsoFD { | ||||
|     pub async fn new(entry: &IsoDir) -> FDt { | ||||
|         let fd = Arc::new(RefCell::new(IsoFD { | ||||
|             fd: FDId::new(), | ||||
|             offset: 0, | ||||
|             lba: entry.data_blk.le, | ||||
|             size: entry.file_size.le, | ||||
|         })) | ||||
|         })); | ||||
| 
 | ||||
|         FD_TABLE.lock().await.register_fd(fd.clone()); | ||||
|         fd | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| @ -32,8 +34,8 @@ impl FileDescriptor for IsoFD { | ||||
|         self.fd | ||||
|     } | ||||
| 
 | ||||
|     async fn write(&mut self, buf: &[u8], count: usize) -> isize { | ||||
|         0 | ||||
|     async fn write(&mut self, _buf: &[u8], _count: usize) -> isize { | ||||
|         -1 | ||||
|     } | ||||
| 
 | ||||
|     #[allow(unaligned_references)] | ||||
|  | ||||
| @ -28,6 +28,7 @@ struct IsoPathTable { | ||||
|     idf: [u8; 0],    // Directory name, of size Self::idf_len
 | ||||
| } | ||||
| 
 | ||||
| #[allow(dead_code)] | ||||
| impl IsoPathTable { | ||||
|     #[allow(unaligned_references)] | ||||
|     pub fn get_idf(&self) -> &[u8] { | ||||
| @ -37,11 +38,13 @@ impl IsoPathTable { | ||||
| 
 | ||||
| // Directory structure
 | ||||
| 
 | ||||
| #[allow(dead_code)] | ||||
| const ISO_MAX_DIR_DEPTH: usize = 8; | ||||
| const ISO_DATE_LEN: usize = 7; | ||||
| 
 | ||||
| #[repr(u8)] | ||||
| #[derive(Copy, Clone)] | ||||
| #[derive(Copy, Clone, PartialEq, Eq)] | ||||
| #[allow(dead_code)] | ||||
| pub enum IsoFileType { | ||||
|     HIDDEN = 0x1,    // Hidden file
 | ||||
|     ISDIR = 0x2,     // Directory
 | ||||
|  | ||||
| @ -3,15 +3,13 @@ pub mod iso9660; | ||||
| 
 | ||||
| use crate::drivers::atapi::read_block; | ||||
| use crate::fd::{FDt, FD_TABLE}; | ||||
| use crate::println; | ||||
| use crate::serial_println; | ||||
| use crate::utils::unserialize; | ||||
| 
 | ||||
| use super::FileSystem; | ||||
| use fd::IsoFD; | ||||
| use iso9660::{IsoDir, IsoPrimVolDesc}; | ||||
| 
 | ||||
| use alloc::{boxed::Box, sync::Arc, string::String, vec::Vec}; | ||||
| use alloc::{boxed::Box, string::String, vec::Vec}; | ||||
| use async_trait::async_trait; | ||||
| 
 | ||||
| pub struct IsoFS {} | ||||
| @ -50,7 +48,14 @@ impl FileSystem for IsoFS { | ||||
|                 // Found entry
 | ||||
|                 if curr_entry.matches(path_component) { | ||||
|                     found = true; | ||||
| 
 | ||||
|                     // Not the last component, go 1 directory deeper
 | ||||
|                     if path_component != path_split[path_split.len() - 1] { | ||||
|                         // Not a directory
 | ||||
|                         if curr_entry.file_type != iso9660::IsoFileType::ISDIR { | ||||
|                             return None; | ||||
|                         } | ||||
|                         // Deeper entries
 | ||||
|                         curr_entry_block = read_block(curr_entry.data_blk.le).await; | ||||
|                         curr_entry = unserialize(curr_entry_block.as_ptr()); | ||||
|                     } | ||||
| @ -60,14 +65,18 @@ impl FileSystem for IsoFS { | ||||
|                 // Next entry
 | ||||
|                 curr_entry = curr_entry.next_entry(); | ||||
|             } | ||||
| 
 | ||||
|             // File not found
 | ||||
|             if !found { | ||||
|                 return None; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         let fd = IsoFD::new(curr_entry); | ||||
|         FD_TABLE.lock().await.register_fd(fd.clone()); | ||||
|         Some(fd) | ||||
|         Some(IsoFD::new(curr_entry).await) | ||||
|     } | ||||
| 
 | ||||
|     async fn close(&mut self, fd: FDt) { | ||||
|         FD_TABLE.lock().await.unregister_fd(fd.clone()); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -17,6 +17,7 @@ lazy_static! { | ||||
| #[async_trait(?Send)] | ||||
| pub trait FileSystem { | ||||
|     async fn open(&mut self, path: &str, flags: u32) -> Option<FDt>; | ||||
|     async fn close(&mut self, fd: FDt); | ||||
| } | ||||
| 
 | ||||
| pub struct VirtualFS { | ||||
| @ -36,4 +37,8 @@ impl FileSystem for VirtualFS { | ||||
|     async fn open(&mut self, path: &str, flags: u32) -> Option<FDt> { | ||||
|         self.fs.borrow_mut().open(path, flags).await | ||||
|     } | ||||
|     
 | ||||
|     async fn close(&mut self, fd: FDt) { | ||||
|         self.fs.borrow_mut().close(fd).await | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -74,6 +74,8 @@ async fn get_file() { | ||||
|     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()); | ||||
|     serial_println!("{:?}", read); | ||||
|     serial_println!("{}", alloc::str::from_utf8(&buf).unwrap()); | ||||
| 
 | ||||
|     fs::VIRTUAL_FS.lock().await.close(fd).await; | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user