From 85e999a7b06c15f83718ab1ed4db68ef46294d76 Mon Sep 17 00:00:00 2001 From: Baptiste Date: Wed, 5 Apr 2023 17:23:54 +0200 Subject: [PATCH] no more errors in filesys & fsmisc... for now --- src/filesys/directory.rs | 11 ++++++ src/filesys/filehdr.rs | 4 +-- src/filesys/filesys.rs | 76 ++++++++++++++++++++-------------------- src/filesys/fsmisc.rs | 10 +++--- 4 files changed, 56 insertions(+), 45 deletions(-) diff --git a/src/filesys/directory.rs b/src/filesys/directory.rs index 33777bc..3ed3598 100644 --- a/src/filesys/directory.rs +++ b/src/filesys/directory.rs @@ -165,5 +165,16 @@ impl Directory { } } + /// Return true if the directory is empty + pub fn is_empty(self) -> bool { + let mut empty = true; + for i in 0..self.table_size { + if self.table[i as usize].in_use { + empty = false; + } + } + empty + } + } \ No newline at end of file diff --git a/src/filesys/filehdr.rs b/src/filesys/filehdr.rs index c63f21b..01fe523 100644 --- a/src/filesys/filehdr.rs +++ b/src/filesys/filehdr.rs @@ -102,7 +102,7 @@ impl FileHdr { } ///Fetch contents of file header from disk. - fn fetch_from(&mut self, sector: i32, drv_disk: &mut DrvDisk) { + pub fn fetch_from(&mut self, sector: i32, drv_disk: &mut DrvDisk) { //temporary buffer let mut sector_img = vec![0; SECTOR_SIZE as usize / std::mem::size_of::() ]; let mut data_sectors = vec![0; MAX_DATA_SECTORS as usize]; @@ -149,7 +149,7 @@ impl FileHdr { } - fn write_back(&self, sector: i32, drv_disk: &mut DrvDisk) { + pub fn write_back(&self, sector: i32, drv_disk: &mut DrvDisk) { let mut sector_img = vec![0; DATAS_IN_SECTOR as usize]; // Fills the temporary buffer with zeroes diff --git a/src/filesys/filesys.rs b/src/filesys/filesys.rs index d309360..e4e4973 100644 --- a/src/filesys/filesys.rs +++ b/src/filesys/filesys.rs @@ -101,29 +101,29 @@ impl Filesys { /// ### parameters /// /// - **format** should we initialize the disk? - pub fn init_filesys(format: bool, drv_isk : DrvDisk) -> Filesys { + pub fn init_filesys(format: bool, mut drv_disk : DrvDisk) -> Filesys { if format { - let free_map = BitMap::init_bitmap(disk::NUM_SECTORS as usize); - let directory = Directory::init_directory(NUM_DIR_ENTRIES, drv_isk); + let mut free_map = BitMap::init_bitmap(disk::NUM_SECTORS as usize); + let mut directory = Directory::init_directory(NUM_DIR_ENTRIES, drv_disk); free_map.mark(FREE_MAP_SECTOR as usize); free_map.mark(DIRECTORY_SECTOR as usize); - let map_header: FileHdr; - let dir_header: FileHdr; + let mut map_header: FileHdr; + let mut dir_header: FileHdr; map_header.allocate(free_map, FREE_MAP_SECTOR); dir_header.allocate(free_map, DIRECTORY_FILE_SIZE); dir_header.set_dir(); - map_header.write_back(FREE_MAP_SECTOR); - dir_header.write_back(DIRECTORY_SECTOR); + map_header.write_back(FREE_MAP_SECTOR, &mut drv_disk); + dir_header.write_back(DIRECTORY_SECTOR, &mut drv_disk); - let free_map_file = OpenFile::open_file(FREE_MAP_SECTOR); + let mut free_map_file = OpenFile::open_file(FREE_MAP_SECTOR); let directory_file = OpenFile::open_file(DIRECTORY_SECTOR); - free_map.write_back(free_map_file); + free_map.write_back(&mut free_map_file, &mut drv_disk); directory.write_back(directory_file); Filesys { @@ -163,7 +163,7 @@ impl Filesys { /// /// - **name** is the name of file to be created (NOT MODIFIED) /// - **initialSize** is the size of file to be created - pub fn create(self, name: String, initial_size: i32, file_sys : Filesys, drv_disk : DrvDisk) -> Result<(), ErrorCode> { + pub fn create(&mut self, name: String, initial_size: i32, file_sys : Filesys, mut drv_disk : DrvDisk) -> Result<(), ErrorCode> { //lock.acquire(); let mut dir_name = name.clone(); @@ -184,8 +184,8 @@ impl Filesys { } // Get the freemap from the disk - let free_map = BitMap::init_bitmap(disk::NUM_SECTORS as usize); - free_map.fetch_from(self.free_map_file); + let mut free_map = BitMap::init_bitmap(disk::NUM_SECTORS as usize); + free_map.fetch_from(&mut self.free_map_file, &mut drv_disk); // Find a sector to hold the file header let sector = free_map.find(); @@ -205,7 +205,7 @@ impl Filesys { } // Indicate that this is a file, not a directory - let hdr = FileHdr::init_file_hdr(drv_disk); + let mut hdr = FileHdr::init_file_hdr(); hdr.set_file(); if !hdr.allocate(free_map, initial_size) { @@ -214,9 +214,9 @@ impl Filesys { } // everthing worked, flush all changes back to disk - hdr.write_back(sector); + hdr.write_back(sector, &mut drv_disk); directory.write_back(dir_file); - free_map.write_back(self.free_map_file); + free_map.write_back(&mut self.free_map_file, &mut drv_disk); //lock.release(); @@ -231,7 +231,7 @@ impl Filesys { /// ### parameters /// /// - **name** the text name of the file to be opened (NOT MODIFIED) - pub fn open(self, name: String, file_sys : Filesys, drv_disk : DrvDisk) -> Option<&mut OpenFile> { + pub fn open(self, name: String, file_sys : Filesys, drv_disk : DrvDisk) -> Option { let mut open_file: OpenFile; let mut dir_name = name.clone(); @@ -250,13 +250,13 @@ impl Filesys { let sector = directory.find(dir_name); if sector >= 0 { open_file = OpenFile::open_file(sector); - open_file.set_name(name); - if open_file.is_dir() { + open_file.name = name; + if open_file.hdr.is_dir() { return None; } } - Some(&mut open_file) + Some(open_file) } /// Delete a file from the file system. @@ -269,7 +269,7 @@ impl Filesys { /// ### parameters /// /// - **name** the text name of the file to be removed (NOT MODIFIED) - pub fn remove(self, name: String, file_sys : Filesys, drv_disk : DrvDisk) -> Result<(), ErrorCode> { + pub fn remove(&mut self, name: String, file_sys : Filesys, mut drv_disk : DrvDisk) -> Result<(), ErrorCode> { let mut dir_name = name.clone(); // Get the sector number of the parent directory @@ -294,8 +294,8 @@ impl Filesys { } // Fetch the file header from disk - let file_hdr: FileHdr; - file_hdr.fetch_from(self.free_map_file); + let mut file_hdr: FileHdr; + file_hdr.fetch_from(sector, &mut drv_disk); // Do nothing if it's a directory if file_hdr.is_dir() { @@ -303,8 +303,8 @@ impl Filesys { } // Get the freemap file from the disk - let free_map = BitMap::init_bitmap(disk::NUM_SECTORS as usize); - free_map.fetch_from(self.free_map_file); + let mut free_map = BitMap::init_bitmap(disk::NUM_SECTORS as usize); + free_map.fetch_from(&mut self.free_map_file, &mut drv_disk); // Indicate that sectors are deallocated in the freemap file_hdr.deallocate(free_map); @@ -314,7 +314,7 @@ impl Filesys { directory.remove(dir_name); // Flush everything to disk - free_map.write_back(self.free_map_file); + free_map.write_back(&mut self.free_map_file, &mut drv_disk); directory.write_back(dir_file); Ok(()) @@ -364,7 +364,7 @@ impl Filesys { /// ### parameters /// /// - **name** is the name of directory to be created (NOT MODIFIED) - pub fn mkdir(self, name: String, file_sys : Filesys, drv_disk : DrvDisk) -> Result<(), ErrorCode> { + pub fn mkdir(&mut self, name: String, file_sys : Filesys, mut drv_disk : DrvDisk) -> Result<(), ErrorCode> { let mut dir_name = name.clone(); // Lokk for the sector number of the parent directory @@ -384,8 +384,8 @@ impl Filesys { } // Get the freemap - let free_map = BitMap::init_bitmap(disk::NUM_SECTORS as usize); - free_map.fetch_from(self.free_map_file); + let mut free_map = BitMap::init_bitmap(disk::NUM_SECTORS as usize); + free_map.fetch_from(&mut self.free_map_file, &mut drv_disk); // Get a free sector for the file header let hdr_sector = free_map.find(); @@ -394,7 +394,7 @@ impl Filesys { } // Allocate free sectors for the directory contents - let hdr: FileHdr; + let mut hdr: FileHdr; if !hdr.allocate(free_map, DIRECTORY_FILE_SIZE) { return Err(ErrorCode::OutOfDisk); } @@ -410,7 +410,7 @@ impl Filesys { // File header hdr.set_dir(); - hdr.write_back(hdr_sector); + hdr.write_back(hdr_sector, &mut drv_disk); // New directory (initially empty) let new_dir_file = OpenFile::open_file(hdr_sector); @@ -419,7 +419,7 @@ impl Filesys { // Parent directory parent_dir.write_back(parent_dir_file); - free_map.write_back(self.free_map_file); + free_map.write_back(&mut self.free_map_file, &mut drv_disk); Ok(()) } @@ -436,7 +436,7 @@ impl Filesys { /// ### parameters /// /// - **name** the text name of the directory to be removed (NOT MODIFIED) - pub fn rmdir(self, name: String, file_sys : Filesys, drv_disk : DrvDisk) -> Result<(), ErrorCode> { + pub fn rmdir(&mut self, name: String, file_sys : Filesys, mut drv_disk : DrvDisk) -> Result<(), ErrorCode> { let mut dir_name = name.clone(); // Get the sector number of the parent directory @@ -457,8 +457,8 @@ impl Filesys { } // Get its header - let the_dir_header: FileHdr; - the_dir_header.fetch_from(the_dir_sector); + let mut the_dir_header: FileHdr; + the_dir_header.fetch_from(the_dir_sector, &mut drv_disk); // Check that is is a directory if !the_dir_header.is_dir() { @@ -471,13 +471,13 @@ impl Filesys { the_dir.fetch_from(the_dir_file); // Check that is is empty - if !the_dir.empty() { + if !the_dir.is_empty() { return Err(ErrorCode::DirectoryNotEmpty); } // Get the freemap from disk - let free_map = BitMap::init_bitmap(disk::NUM_SECTORS as usize); - free_map.fetch_from(self.free_map_file); + let mut free_map = BitMap::init_bitmap(disk::NUM_SECTORS as usize); + free_map.fetch_from(&mut self.free_map_file, &mut drv_disk); // Deallocate the data sectors of the directory the_dir_header.deallocate(free_map); @@ -489,7 +489,7 @@ impl Filesys { parent_dir.remove(dir_name); // Flush everything to disk - free_map.write_back(self.free_map_file); + free_map.write_back(&mut self.free_map_file, &mut drv_disk); parent_dir.write_back(parent_dir_file); Ok(()) diff --git a/src/filesys/fsmisc.rs b/src/filesys/fsmisc.rs index 138c01d..41cc535 100644 --- a/src/filesys/fsmisc.rs +++ b/src/filesys/fsmisc.rs @@ -37,11 +37,11 @@ pub fn copy(from: String, to: String, file_sys : Filesys, mut drv_disk : DrvDisk let file_length = file_length_buf[0]; file_sys.create(to, file_length as i32, file_sys, drv_disk); - let open_file_opt = file_sys.open(to, file_sys, drv_disk); + let mut open_file_opt = file_sys.open(to, file_sys, drv_disk); let open_file : &mut OpenFile; match open_file_opt { Some(f) => { - open_file = f; + open_file = &mut f; }, None => return } @@ -67,11 +67,11 @@ pub fn copy(from: String, to: String, file_sys : Filesys, mut drv_disk : DrvDisk /// /// - **name** of the BurritOS file pub fn print(name: String, file_sys : Filesys, mut drv_disk : DrvDisk) { - let open_file_opt = file_sys.open(name, file_sys, drv_disk); + let mut open_file_opt = file_sys.open(name, file_sys, drv_disk); let open_file : &mut OpenFile; match open_file_opt { - Some(f) => { - open_file = f; + Some(mut f) => { + open_file = &mut f; }, None => return }