feat(storage): add mkdir to FileSystem trait with stubs
This commit is contained in:
@@ -116,4 +116,6 @@ impl FileSystem for MockFileSystem {
|
|||||||
fn file_size(&mut self, handle: FileHandle) -> Option<usize> {
|
fn file_size(&mut self, handle: FileHandle) -> Option<usize> {
|
||||||
self.files[handle.raw() as usize].as_ref().map(|e| e.size)
|
self.files[handle.raw() as usize].as_ref().map(|e| e.size)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn mkdir(&mut self, _path: &[u8]) -> bool { true }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,4 +73,5 @@ pub trait FileSystem {
|
|||||||
fn create(&mut self, path: &[u8]) -> Option<FileHandle>;
|
fn create(&mut self, path: &[u8]) -> Option<FileHandle>;
|
||||||
fn delete(&mut self, path: &[u8]) -> bool;
|
fn delete(&mut self, path: &[u8]) -> bool;
|
||||||
fn file_size(&mut self, handle: FileHandle) -> Option<usize>;
|
fn file_size(&mut self, handle: FileHandle) -> Option<usize>;
|
||||||
|
fn mkdir(&mut self, path: &[u8]) -> bool;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -336,6 +336,8 @@ impl<B: BlockDevice> FileSystem for Ext4<B> {
|
|||||||
fn file_size(&mut self, handle: FileHandle) -> Option<usize> {
|
fn file_size(&mut self, handle: FileHandle) -> Option<usize> {
|
||||||
self.open_files[handle.raw() as usize].as_ref().map(|f| f.size)
|
self.open_files[handle.raw() as usize].as_ref().map(|f| f.size)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn mkdir(&mut self, _path: &[u8]) -> bool { false }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_u32(data: &[u8], offset: usize) -> u32 {
|
fn read_u32(data: &[u8], offset: usize) -> u32 {
|
||||||
|
|||||||
@@ -368,6 +368,8 @@ impl<B: BlockDevice> FileSystem for Fat16<B> {
|
|||||||
fn file_size(&mut self, handle: FileHandle) -> Option<usize> {
|
fn file_size(&mut self, handle: FileHandle) -> Option<usize> {
|
||||||
self.open_files[handle.raw() as usize].as_ref().map(|f| f.size)
|
self.open_files[handle.raw() as usize].as_ref().map(|f| f.size)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn mkdir(&mut self, _path: &[u8]) -> bool { false }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn to_fat_name(name: &[u8]) -> [u8; 11] {
|
fn to_fat_name(name: &[u8]) -> [u8; 11] {
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ pub enum StorageRequest {
|
|||||||
Create { path: PackedPath },
|
Create { path: PackedPath },
|
||||||
Delete { path: PackedPath },
|
Delete { path: PackedPath },
|
||||||
FileSize { handle: FileHandle },
|
FileSize { handle: FileHandle },
|
||||||
|
Mkdir { path: PackedPath },
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
@@ -71,6 +72,7 @@ impl Encode for StorageRequest {
|
|||||||
StorageRequest::Create { path } => [5, path.word0(), path.word1(), 0],
|
StorageRequest::Create { path } => [5, path.word0(), path.word1(), 0],
|
||||||
StorageRequest::Delete { path } => [6, path.word0(), path.word1(), 0],
|
StorageRequest::Delete { path } => [6, path.word0(), path.word1(), 0],
|
||||||
StorageRequest::FileSize { handle } => [7, handle.raw() as usize, 0, 0],
|
StorageRequest::FileSize { handle } => [7, handle.raw() as usize, 0, 0],
|
||||||
|
StorageRequest::Mkdir { path } => [8, path.word0(), path.word1(), 0],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -86,6 +88,7 @@ impl Decode for StorageRequest {
|
|||||||
5 => Some(StorageRequest::Create { path: PackedPath::from_words(words[1], words[2]) }),
|
5 => Some(StorageRequest::Create { path: PackedPath::from_words(words[1], words[2]) }),
|
||||||
6 => Some(StorageRequest::Delete { path: PackedPath::from_words(words[1], words[2]) }),
|
6 => Some(StorageRequest::Delete { path: PackedPath::from_words(words[1], words[2]) }),
|
||||||
7 => Some(StorageRequest::FileSize { handle: FileHandle::new(words[1] as u16) }),
|
7 => Some(StorageRequest::FileSize { handle: FileHandle::new(words[1] as u16) }),
|
||||||
|
8 => Some(StorageRequest::Mkdir { path: PackedPath::from_words(words[1], words[2]) }),
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -82,6 +82,15 @@ impl<F: FileSystem> Server for StorageServer<F> {
|
|||||||
None => StorageResponse::Error,
|
None => StorageResponse::Error,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
StorageRequest::Mkdir { path } => {
|
||||||
|
let buf = path.to_bytes();
|
||||||
|
let len = buf.iter().position(|&b| b == 0).unwrap_or(16);
|
||||||
|
if self.fs.mkdir(&buf[..len]) {
|
||||||
|
StorageResponse::Ok
|
||||||
|
} else {
|
||||||
|
StorageResponse::Error
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,6 +59,13 @@ fn all_response_variants() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn mkdir_roundtrip() {
|
||||||
|
let path = PackedPath::from_bytes(b"mydir");
|
||||||
|
let req = StorageRequest::Mkdir { path };
|
||||||
|
assert_eq!(StorageRequest::decode(req.encode()), Some(req));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn invalid_request_returns_none() {
|
fn invalid_request_returns_none() {
|
||||||
assert!(StorageRequest::decode([99, 0, 0, 0]).is_none());
|
assert!(StorageRequest::decode([99, 0, 0, 0]).is_none());
|
||||||
|
|||||||
@@ -68,6 +68,13 @@ fn list_dir() {
|
|||||||
assert_eq!(resp, StorageResponse::DirEntries { count: 2 });
|
assert_eq!(resp, StorageResponse::DirEntries { count: 2 });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn mkdir_returns_ok() {
|
||||||
|
let mut server = test_server();
|
||||||
|
let resp = server.handle(StorageRequest::Mkdir { path: path(b"subdir") });
|
||||||
|
assert_eq!(resp, StorageResponse::Ok);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn close_succeeds() {
|
fn close_succeeds() {
|
||||||
let mut server = test_server();
|
let mut server = test_server();
|
||||||
|
|||||||
Reference in New Issue
Block a user