|
|
|
@ -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<OpenFile> {
|
|
|
|
|
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(())
|
|
|
|
|