no more errors in filesys & fsmisc... for now

This commit is contained in:
Baptiste 2023-04-05 17:23:54 +02:00
parent dae609c6ed
commit 85e999a7b0
4 changed files with 56 additions and 45 deletions

View File

@ -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
}
} }

View File

@ -102,7 +102,7 @@ impl FileHdr {
} }
///Fetch contents of file header from disk. ///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 //temporary buffer
let mut sector_img = vec![0; SECTOR_SIZE as usize / std::mem::size_of::<i32>() ]; let mut sector_img = vec![0; SECTOR_SIZE as usize / std::mem::size_of::<i32>() ];
let mut data_sectors = vec![0; MAX_DATA_SECTORS as usize]; 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]; let mut sector_img = vec![0; DATAS_IN_SECTOR as usize];
// Fills the temporary buffer with zeroes // Fills the temporary buffer with zeroes

View File

@ -101,29 +101,29 @@ impl Filesys {
/// ### parameters /// ### parameters
/// ///
/// - **format** should we initialize the disk? /// - **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 { if format {
let free_map = BitMap::init_bitmap(disk::NUM_SECTORS as usize); let mut free_map = BitMap::init_bitmap(disk::NUM_SECTORS as usize);
let directory = Directory::init_directory(NUM_DIR_ENTRIES, drv_isk); let mut directory = Directory::init_directory(NUM_DIR_ENTRIES, drv_disk);
free_map.mark(FREE_MAP_SECTOR as usize); free_map.mark(FREE_MAP_SECTOR as usize);
free_map.mark(DIRECTORY_SECTOR as usize); free_map.mark(DIRECTORY_SECTOR as usize);
let map_header: FileHdr; let mut map_header: FileHdr;
let dir_header: FileHdr; let mut dir_header: FileHdr;
map_header.allocate(free_map, FREE_MAP_SECTOR); map_header.allocate(free_map, FREE_MAP_SECTOR);
dir_header.allocate(free_map, DIRECTORY_FILE_SIZE); dir_header.allocate(free_map, DIRECTORY_FILE_SIZE);
dir_header.set_dir(); dir_header.set_dir();
map_header.write_back(FREE_MAP_SECTOR); map_header.write_back(FREE_MAP_SECTOR, &mut drv_disk);
dir_header.write_back(DIRECTORY_SECTOR); 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); 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); directory.write_back(directory_file);
Filesys { Filesys {
@ -163,7 +163,7 @@ impl Filesys {
/// ///
/// - **name** is the name of file to be created (NOT MODIFIED) /// - **name** is the name of file to be created (NOT MODIFIED)
/// - **initialSize** is the size of file to be created /// - **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(); //lock.acquire();
let mut dir_name = name.clone(); let mut dir_name = name.clone();
@ -184,8 +184,8 @@ impl Filesys {
} }
// Get the freemap from the disk // Get the freemap from the disk
let free_map = BitMap::init_bitmap(disk::NUM_SECTORS as usize); let mut free_map = BitMap::init_bitmap(disk::NUM_SECTORS as usize);
free_map.fetch_from(self.free_map_file); free_map.fetch_from(&mut self.free_map_file, &mut drv_disk);
// Find a sector to hold the file header // Find a sector to hold the file header
let sector = free_map.find(); let sector = free_map.find();
@ -205,7 +205,7 @@ impl Filesys {
} }
// Indicate that this is a file, not a directory // 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(); hdr.set_file();
if !hdr.allocate(free_map, initial_size) { if !hdr.allocate(free_map, initial_size) {
@ -214,9 +214,9 @@ impl Filesys {
} }
// everthing worked, flush all changes back to disk // everthing worked, flush all changes back to disk
hdr.write_back(sector); hdr.write_back(sector, &mut drv_disk);
directory.write_back(dir_file); 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(); //lock.release();
@ -231,7 +231,7 @@ impl Filesys {
/// ### parameters /// ### parameters
/// ///
/// - **name** the text name of the file to be opened (NOT MODIFIED) /// - **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<OpenFile> {
let mut open_file: OpenFile; let mut open_file: OpenFile;
let mut dir_name = name.clone(); let mut dir_name = name.clone();
@ -250,13 +250,13 @@ impl Filesys {
let sector = directory.find(dir_name); let sector = directory.find(dir_name);
if sector >= 0 { if sector >= 0 {
open_file = OpenFile::open_file(sector); open_file = OpenFile::open_file(sector);
open_file.set_name(name); open_file.name = name;
if open_file.is_dir() { if open_file.hdr.is_dir() {
return None; return None;
} }
} }
Some(&mut open_file) Some(open_file)
} }
/// Delete a file from the file system. /// Delete a file from the file system.
@ -269,7 +269,7 @@ impl Filesys {
/// ### parameters /// ### parameters
/// ///
/// - **name** the text name of the file to be removed (NOT MODIFIED) /// - **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(); let mut dir_name = name.clone();
// Get the sector number of the parent directory // Get the sector number of the parent directory
@ -294,8 +294,8 @@ impl Filesys {
} }
// Fetch the file header from disk // Fetch the file header from disk
let file_hdr: FileHdr; let mut file_hdr: FileHdr;
file_hdr.fetch_from(self.free_map_file); file_hdr.fetch_from(sector, &mut drv_disk);
// Do nothing if it's a directory // Do nothing if it's a directory
if file_hdr.is_dir() { if file_hdr.is_dir() {
@ -303,8 +303,8 @@ impl Filesys {
} }
// Get the freemap file from the disk // Get the freemap file from the disk
let free_map = BitMap::init_bitmap(disk::NUM_SECTORS as usize); let mut free_map = BitMap::init_bitmap(disk::NUM_SECTORS as usize);
free_map.fetch_from(self.free_map_file); free_map.fetch_from(&mut self.free_map_file, &mut drv_disk);
// Indicate that sectors are deallocated in the freemap // Indicate that sectors are deallocated in the freemap
file_hdr.deallocate(free_map); file_hdr.deallocate(free_map);
@ -314,7 +314,7 @@ impl Filesys {
directory.remove(dir_name); directory.remove(dir_name);
// Flush everything to disk // 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); directory.write_back(dir_file);
Ok(()) Ok(())
@ -364,7 +364,7 @@ impl Filesys {
/// ### parameters /// ### parameters
/// ///
/// - **name** is the name of directory to be created (NOT MODIFIED) /// - **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(); let mut dir_name = name.clone();
// Lokk for the sector number of the parent directory // Lokk for the sector number of the parent directory
@ -384,8 +384,8 @@ impl Filesys {
} }
// Get the freemap // Get the freemap
let free_map = BitMap::init_bitmap(disk::NUM_SECTORS as usize); let mut free_map = BitMap::init_bitmap(disk::NUM_SECTORS as usize);
free_map.fetch_from(self.free_map_file); free_map.fetch_from(&mut self.free_map_file, &mut drv_disk);
// Get a free sector for the file header // Get a free sector for the file header
let hdr_sector = free_map.find(); let hdr_sector = free_map.find();
@ -394,7 +394,7 @@ impl Filesys {
} }
// Allocate free sectors for the directory contents // Allocate free sectors for the directory contents
let hdr: FileHdr; let mut hdr: FileHdr;
if !hdr.allocate(free_map, DIRECTORY_FILE_SIZE) { if !hdr.allocate(free_map, DIRECTORY_FILE_SIZE) {
return Err(ErrorCode::OutOfDisk); return Err(ErrorCode::OutOfDisk);
} }
@ -410,7 +410,7 @@ impl Filesys {
// File header // File header
hdr.set_dir(); hdr.set_dir();
hdr.write_back(hdr_sector); hdr.write_back(hdr_sector, &mut drv_disk);
// New directory (initially empty) // New directory (initially empty)
let new_dir_file = OpenFile::open_file(hdr_sector); let new_dir_file = OpenFile::open_file(hdr_sector);
@ -419,7 +419,7 @@ impl Filesys {
// Parent directory // Parent directory
parent_dir.write_back(parent_dir_file); 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(()) Ok(())
} }
@ -436,7 +436,7 @@ impl Filesys {
/// ### parameters /// ### parameters
/// ///
/// - **name** the text name of the directory to be removed (NOT MODIFIED) /// - **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(); let mut dir_name = name.clone();
// Get the sector number of the parent directory // Get the sector number of the parent directory
@ -457,8 +457,8 @@ impl Filesys {
} }
// Get its header // Get its header
let the_dir_header: FileHdr; let mut the_dir_header: FileHdr;
the_dir_header.fetch_from(the_dir_sector); the_dir_header.fetch_from(the_dir_sector, &mut drv_disk);
// Check that is is a directory // Check that is is a directory
if !the_dir_header.is_dir() { if !the_dir_header.is_dir() {
@ -471,13 +471,13 @@ impl Filesys {
the_dir.fetch_from(the_dir_file); the_dir.fetch_from(the_dir_file);
// Check that is is empty // Check that is is empty
if !the_dir.empty() { if !the_dir.is_empty() {
return Err(ErrorCode::DirectoryNotEmpty); return Err(ErrorCode::DirectoryNotEmpty);
} }
// Get the freemap from disk // Get the freemap from disk
let free_map = BitMap::init_bitmap(disk::NUM_SECTORS as usize); let mut free_map = BitMap::init_bitmap(disk::NUM_SECTORS as usize);
free_map.fetch_from(self.free_map_file); free_map.fetch_from(&mut self.free_map_file, &mut drv_disk);
// Deallocate the data sectors of the directory // Deallocate the data sectors of the directory
the_dir_header.deallocate(free_map); the_dir_header.deallocate(free_map);
@ -489,7 +489,7 @@ impl Filesys {
parent_dir.remove(dir_name); parent_dir.remove(dir_name);
// Flush everything to disk // 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); parent_dir.write_back(parent_dir_file);
Ok(()) Ok(())

View File

@ -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]; let file_length = file_length_buf[0];
file_sys.create(to, file_length as i32, file_sys, drv_disk); 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; let open_file : &mut OpenFile;
match open_file_opt { match open_file_opt {
Some(f) => { Some(f) => {
open_file = f; open_file = &mut f;
}, },
None => return 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 /// - **name** of the BurritOS file
pub fn print(name: String, file_sys : Filesys, mut drv_disk : DrvDisk) { 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; let open_file : &mut OpenFile;
match open_file_opt { match open_file_opt {
Some(f) => { Some(mut f) => {
open_file = f; open_file = &mut f;
}, },
None => return None => return
} }