adding filesys & drvdisk in params of filesys and fsmisc

This commit is contained in:
Baptiste 2023-04-05 16:44:28 +02:00
parent 4d2f27b3b2
commit 551c9079b9
4 changed files with 93 additions and 78 deletions

View File

@ -55,7 +55,6 @@ impl Directory {
table_size: size,
table: tmp,
drv_disk: drv_disk_,
}
}
@ -74,10 +73,10 @@ impl Directory {
///
/// ### Parameters
/// - **name** the file name to look up
pub fn find_index(&self, name: char) -> i32 {
pub fn find_index(&self, name: String) -> i32 {
for i in 0..self.table_size {
if self.table[i as usize].in_use && self.table[i as usize].name.starts_with(&self.table[i as usize].name) {
return i;
return i;
}
}
@ -94,7 +93,7 @@ impl Directory {
/// ### Parameters
///
/// - **name** the file name to look up
pub fn find(&self, name: char) -> i32 {
pub fn find(&self, name: String) -> i32 {
let i = self.find_index(name);
if i != -1 {
return self.table[i as usize].sector;
@ -109,7 +108,7 @@ impl Directory {
/// - **new_sector** the disk sector containing the added file's header
///
/// return NO_ERROR, ALREADY_IN_DIRECTORY or NOSPACE_IN_DIRECTORY.
pub fn add(&self, name: char, new_sector: i32) -> Result<(), ErrorCode> {
pub fn add(&self, name: String, new_sector: i32) -> Result<(), ErrorCode> {
if self.find_index(name) != -1 {
return Err(ErrorCode::AlreadyInDirectory);
}
@ -131,7 +130,7 @@ impl Directory {
/// - **name** the file name to be removed
/// return NO_ERROR, or INEXIST_DIRECTORY_ERROR
pub fn remove(&self, name: char) -> Result<(), ErrorCode> {
pub fn remove(&self, name: String) -> Result<(), ErrorCode> {
let i = self.find_index(name);
if i == -1 {
return Err(ErrorCode::InexistDirectoryError);

View File

@ -1,6 +1,6 @@
use crate::{kernel::mgerror::ErrorCode, simulator::disk, utility::bitmap::BitMap};
use crate::{kernel::mgerror::ErrorCode, simulator::disk, utility::bitmap::BitMap, drivers::drv_disk::DrvDisk};
use super::filehdr::FileHdr;
use super::{filehdr::FileHdr, openfile::OpenFile, directory::Directory};
pub const ERROR: i32 = -1;
pub const FREE_MAP_SECTOR: i32 = 0;
@ -55,9 +55,9 @@ pub fn decomp_name(origin_path: String, head: &mut String, tail: &mut String) ->
///
/// - **name** is the complete name (relatively to the root directory).
/// its content will be modified!
pub fn find_dir(name: &mut String) -> i32 {
let directory = Directory::init_directory(config.num_dir_entries);
directory.fetch_from(filesys::get_dir_file());
pub fn find_dir(name: &mut String, file_sys : Filesys, drv_disk : DrvDisk) -> i32 {
let directory = Directory::init_directory(NUM_DIR_ENTRIES, drv_disk);
directory.fetch_from(file_sys.get_dir_file());
let mut sector = DIRECTORY_SECTOR;
let mut dirname = String::from("");
@ -72,9 +72,9 @@ pub fn find_dir(name: &mut String) -> i32 {
return -1; // This file/directory does not exist
}
let file = OpenFile::init_open_file(sector);
let file = OpenFile::open_file(sector);
if file.get_file_header().is_dir() {
directory.fetch_from(&file);
directory.fetch_from(file);
} else {
return -1;
}
@ -101,10 +101,10 @@ impl Filesys {
/// ### parameters
///
/// - **format** should we initialize the disk?
pub fn init_filesys(format: bool) -> Filesys {
pub fn init_filesys(format: bool, drv_isk : DrvDisk) -> Filesys {
if format {
let free_map = BitMap::init_bitmap(disk::NUM_SECTORS as usize);
let directory = Directory::init_directory(NUM_DIR_ENTRIES);
let directory = Directory::init_directory(NUM_DIR_ENTRIES, drv_isk);
free_map.mark(FREE_MAP_SECTOR as usize);
free_map.mark(DIRECTORY_SECTOR as usize);
@ -120,8 +120,8 @@ impl Filesys {
map_header.write_back(FREE_MAP_SECTOR);
dir_header.write_back(DIRECTORY_SECTOR);
let free_map_file = OpenFile::init_open_file(FREE_MAP_SECTOR);
let directory_file = OpenFile::init_open_file(DIRECTORY_SECTOR);
let free_map_file = OpenFile::open_file(FREE_MAP_SECTOR);
let directory_file = OpenFile::open_file(DIRECTORY_SECTOR);
free_map.write_back(free_map_file);
directory.write_back(directory_file);
@ -132,8 +132,8 @@ impl Filesys {
}
} else {
Filesys {
free_map_file: OpenFile::init_open_file(FREE_MAP_SECTOR),
directory_file: OpenFile::init_open_file(DIRECTORY_SECTOR),
free_map_file: OpenFile::open_file(FREE_MAP_SECTOR),
directory_file: OpenFile::open_file(DIRECTORY_SECTOR),
}
}
}
@ -163,23 +163,23 @@ 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) -> Result<(), ErrorCode> {
lock.acquire();
pub fn create(self, name: String, initial_size: i32, file_sys : Filesys, drv_disk : DrvDisk) -> Result<(), ErrorCode> {
//lock.acquire();
let mut dir_name = name.clone();
let dir_sector = find_dir(&mut dir_name);
let dir_sector = find_dir(&mut dir_name, file_sys, drv_disk);
if dir_sector == ERROR {
lock.release();
//lock.release();
return Err(ErrorCode::InexistFileError);
}
let dir_file = OpenFile::init_open_file(dir_sector);
let directory = Directory::init_directory(NUM_DIR_ENTRIES);
directory.fetch_from(&dir_file);
let dir_file = OpenFile::open_file(dir_sector);
let directory = Directory::init_directory(NUM_DIR_ENTRIES, drv_disk);
directory.fetch_from(dir_file);
if directory.find(dir_name) != ERROR {
lock.release();
//lock.release();
return Err(ErrorCode::AlreadyInDirectory);
}
@ -190,7 +190,7 @@ impl Filesys {
// Find a sector to hold the file header
let sector = free_map.find();
if sector == ERROR {
lock.release();
//lock.release();
return Err(ErrorCode::OutOfDisk);
}
@ -198,27 +198,27 @@ impl Filesys {
let add_result = directory.add(dir_name, sector);
match add_result {
Err(e) => {
lock.release();
//lock.release();
return Err(e);
}
_ => {}
}
// Indicate that this is a file, not a directory
let hdr = FileHdr::init_file_hdr();
let hdr = FileHdr::init_file_hdr(drv_disk);
hdr.set_file();
if !hdr.allocate(free_map, initial_size) {
lock.release();
//lock.release();
return Err(ErrorCode::OutOfDisk);
}
// everthing worked, flush all changes back to disk
hdr.write_back(sector);
directory.write_back(&dir_file);
directory.write_back(dir_file);
free_map.write_back(self.free_map_file);
lock.release();
//lock.release();
Ok(())
}
@ -231,32 +231,32 @@ impl Filesys {
/// ### parameters
///
/// - **name** the text name of the file to be opened (NOT MODIFIED)
pub fn open(name: String) -> Option<OpenFile> {
let open_file: OpenFile;
pub fn open(self, name: String, file_sys : Filesys, drv_disk : DrvDisk) -> Option<&mut OpenFile> {
let mut open_file: OpenFile;
let mut dir_name = name.clone();
// Find the directory containing the file
let dir_sector = find_dir(&mut dir_name);
let dir_sector = find_dir(&mut dir_name, file_sys, drv_disk);
if dir_sector == ERROR {
return None;
}
// Read the directory from disk
let dir_file = OpenFile::init_open_file(dir_sector);
let directory = Directory::init_directory(NUM_DIR_ENTRIES);
directory.fetch_from(&directory);
let dir_file = OpenFile::open_file(dir_sector);
let directory = Directory::init_directory(NUM_DIR_ENTRIES, drv_disk);
directory.fetch_from(dir_file);
// Find the file in the directory
let sector = directory.find(dir_name);
if sector >= 0 {
open_file = OpenFile::init_open_file(sector);
open_file = OpenFile::open_file(sector);
open_file.set_name(name);
if open_file.is_dir() {
return None;
}
}
Some(open_file)
Some(&mut open_file)
}
/// Delete a file from the file system.
@ -269,11 +269,11 @@ impl Filesys {
/// ### parameters
///
/// - **name** the text name of the file to be removed (NOT MODIFIED)
pub fn remove(self, name: String) -> Result<(), ErrorCode> {
pub fn remove(self, name: String, file_sys : Filesys, drv_disk : DrvDisk) -> Result<(), ErrorCode> {
let mut dir_name = name.clone();
// Get the sector number of the parent directory
let dir_sector = find_dir(&mut dir_name);
let dir_sector = find_dir(&mut dir_name, file_sys, drv_disk);
// Check if the path is correct
if dir_sector == ERROR {
@ -281,9 +281,9 @@ impl Filesys {
}
// Fetch the directory from the disk
let dir_file = OpenFile::init_open_file(dir_sector);
let directory = Directory::init_directory(NUM_DIR_ENTRIES);
directory.fetch_from(&dir_file);
let dir_file = OpenFile::open_file(dir_sector);
let directory = Directory::init_directory(NUM_DIR_ENTRIES, drv_disk);
directory.fetch_from(dir_file);
// Look for the file in the directory
let sector = directory.find(dir_name);
@ -308,7 +308,7 @@ impl Filesys {
// Indicate that sectors are deallocated in the freemap
file_hdr.deallocate(free_map);
free_map.clear(sector);
free_map.clear(sector as usize);
// Remove the file from the directory
directory.remove(dir_name);
@ -364,18 +364,18 @@ impl Filesys {
/// ### parameters
///
/// - **name** is the name of directory to be created (NOT MODIFIED)
pub fn mkdir(self, name: String) -> Result<(), ErrorCode> {
pub fn mkdir(self, name: String, file_sys : Filesys, drv_disk : DrvDisk) -> Result<(), ErrorCode> {
let mut dir_name = name.clone();
// Lokk for the sector number of the parent directory
let parent_sector = find_dir(&mut dir_name);
let parent_sector = find_dir(&mut dir_name, file_sys, drv_disk);
if parent_sector < 0 {
return Err(ErrorCode::InexistDirectoryError);
}
// Fetch it from disk
let parent_dir_file = OpenFile::init_open_file(parent_sector);
let parent_dir = Directory::init_directory(NUM_DIR_ENTRIES);
let parent_dir_file = OpenFile::open_file(parent_sector);
let parent_dir = Directory::init_directory(NUM_DIR_ENTRIES, drv_disk);
parent_dir.fetch_from(parent_dir_file);
// Check that the directory does not exit yet
@ -413,8 +413,8 @@ impl Filesys {
hdr.write_back(hdr_sector);
// New directory (initially empty)
let new_dir_file = OpenFile::init_open_file(hdr_sector as usize);
let new_dir = Directory::init_directory(NUM_DIR_ENTRIES);
let new_dir_file = OpenFile::open_file(hdr_sector);
let new_dir = Directory::init_directory(NUM_DIR_ENTRIES, drv_disk);
new_dir.write_back(new_dir_file);
// Parent directory
@ -436,18 +436,18 @@ impl Filesys {
/// ### parameters
///
/// - **name** the text name of the directory to be removed (NOT MODIFIED)
pub fn rmdir(self, name: String) -> Result<(), ErrorCode> {
pub fn rmdir(self, name: String, file_sys : Filesys, drv_disk : DrvDisk) -> Result<(), ErrorCode> {
let mut dir_name = name.clone();
// Get the sector number of the parent directory
let parent_sector = find_dir(&mut dir_name);
let parent_sector = find_dir(&mut dir_name, file_sys, drv_disk);
if parent_sector < 0 {
return Err(ErrorCode::InexistDirectoryError);
}
// Fetch it from disk
let parent_dir_file = OpenFile::init_open_file(parent_sector);
let parent_dir = Directory::init_directory(NUM_DIR_ENTRIES);
let parent_dir_file = OpenFile::open_file(parent_sector);
let parent_dir = Directory::init_directory(NUM_DIR_ENTRIES, drv_disk);
parent_dir.fetch_from(parent_dir_file);
// Check that the directory to be removed exist
@ -466,8 +466,8 @@ impl Filesys {
}
// Fetch its contents from the disk
let the_dir_file = OpenFile::init_open_file(the_dir_sector);
let the_dir = Directory::init_directory(NUM_DIR_ENTRIES);
let the_dir_file = OpenFile::open_file(the_dir_sector);
let the_dir = Directory::init_directory(NUM_DIR_ENTRIES, drv_disk);
the_dir.fetch_from(the_dir_file);
// Check that is is empty
@ -483,7 +483,7 @@ impl Filesys {
the_dir_header.deallocate(free_map);
// Deallocate the sector containing the directory header
free_map.clear(the_dir_sector);
free_map.clear(the_dir_sector as usize);
// We remove the directory from its parent directory
parent_dir.remove(dir_name);

View File

@ -3,11 +3,13 @@ use std::{
io::{Read, Seek, SeekFrom},
};
use super::filesys;
use crate::drivers::drv_disk::DrvDisk;
use super::{filesys::Filesys, openfile::OpenFile};
pub const TRANSFER_SIZE: usize = 10;
/// copy the contents of the UNIX file "from" to the Nachos file "to"
/// copy the contents of the UNIX file "from" to the BurritOS file "to"
///
/// `panic!` when the file from doesn't exist
///
@ -15,7 +17,7 @@ pub const TRANSFER_SIZE: usize = 10;
///
/// - **from** file UNIX
/// - **to** BurritOS file
pub fn copy(from: &str, to: &str) {
pub fn copy(from: String, to: String, file_sys : Filesys, mut drv_disk : DrvDisk) {
let file_from_opt = File::options().read(true).open(from);
let mut file_from: File;
match file_from_opt {
@ -34,15 +36,22 @@ pub fn copy(from: &str, to: &str) {
file_from.seek(SeekFrom::Start(0));
let file_length = file_length_buf[0];
filesys::create(to, file_length);
let open_file = filesys::open(to);
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 open_file : &mut OpenFile;
match open_file_opt {
Some(f) => {
open_file = f;
},
None => return
}
let mut buffer = [0; TRANSFER_SIZE];
let mut buffer = Vec::new();
loop {
let amount_read = file_from
.read(&mut buffer)
.expect("copy : couldn't read the UNIX file");
open_file.write(&buffer[..amount_read]);
OpenFile::write(&mut drv_disk, open_file, &mut buffer, TRANSFER_SIZE as i32);
if amount_read != TRANSFER_SIZE {
break;
@ -50,24 +59,31 @@ pub fn copy(from: &str, to: &str) {
}
}
/// Print the contents of the Nachos file "name".
/// Print the contents of the BurritOS file "name".
///
/// `panic!` when the file name doewn't exist
/// `panic!` when the file name doesn't exist
///
/// ### parameters
///
/// - **name** of the BurritOS file
pub fn print(name: &str) {
let open_file = filesys::open(name);
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 open_file : &mut OpenFile;
match open_file_opt {
Some(f) => {
open_file = f;
},
None => return
}
let mut buffer = [0; TRANSFER_SIZE];
let mut buffer = Vec::new();
loop {
let amount_read = open_file.read(&mut buffer);
let amount_read = OpenFile::read(&mut drv_disk, open_file, &mut buffer, TRANSFER_SIZE as i32);
for i in 0..amount_read {
print!("{:1x} ", buffer[i]);
print!("{:1x} ", buffer[i as usize]);
}
if amount_read != TRANSFER_SIZE {
if amount_read != TRANSFER_SIZE as i32 {
break;
}
}

View File

@ -109,10 +109,10 @@ impl Disk {
}
disk.active = true;
disk.disk_file
.seek(SeekFrom::Start((sector_number * SECTOR_SIZE) as u64))?;
disk.disk_file.seek(SeekFrom::Start((sector_number * SECTOR_SIZE) as u64));
let mut buffer = [0; SECTOR_SIZE as usize];
disk.disk_file.read(&mut buffer)?;
disk.disk_file.read(&mut buffer);
for byte in buffer {
data.push(byte);
}