use crate::structures::common::{self, StructureError};
#[derive(Debug, Default, Clone)]
pub struct YAFFSObject {
pub obj_type: usize,
}
pub fn parse_yaffs_obj_header(
header_data: &[u8],
endianness: &str,
) -> Result<YAFFSObject, StructureError> {
const UNUSED: usize = 0xFFFF;
let yaffs_object_structure = vec![
("type", "u32"),
("parent_id", "u32"),
("name_checksum", "u16"),
];
let allowed_types: Vec<usize> = vec![0, 1, 2, 3, 4, 5];
if let Ok(obj_header) = common::parse(header_data, &yaffs_object_structure, endianness) {
if allowed_types.contains(&obj_header["type"])
&& (obj_header["parent_id"] > 0)
&& (obj_header["name_checksum"] == UNUSED)
{
return Ok(YAFFSObject {
obj_type: obj_header["type"],
});
}
}
Err(StructureError)
}
#[derive(Debug, Default, Clone)]
pub struct YAFFSFileHeader {
pub file_size: usize,
}
pub fn parse_yaffs_file_header(
header_data: &[u8],
endianness: &str,
) -> Result<YAFFSFileHeader, StructureError> {
let yaffs_file_info = vec![
("mode", "u32"),
("uid", "u32"),
("gid", "u32"),
("atime", "u32"),
("mtime", "u32"),
("ctime", "u32"),
("file_size", "u32"),
];
if let Ok(file_info) = common::parse(header_data, &yaffs_file_info, endianness) {
return Ok(YAFFSFileHeader {
file_size: file_info["file_size"],
});
}
Err(StructureError)
}