no more errors in filesys & fsmisc... for now
This commit is contained in:
parent
dae609c6ed
commit
85e999a7b0
@ -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
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
@ -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
|
||||||
|
@ -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(())
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user