|
|
@ -44,13 +44,10 @@ use {
|
|
|
|
storage::common::interface::fs::{FileRead, FileWrite},
|
|
|
|
storage::common::interface::fs::{FileRead, FileWrite},
|
|
|
|
RuntimeResult,
|
|
|
|
RuntimeResult,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
util::os,
|
|
|
|
util::{compiler::TaggedEnum, os},
|
|
|
|
IoResult,
|
|
|
|
IoResult,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
std::{
|
|
|
|
std::{mem::ManuallyDrop, ops::Range},
|
|
|
|
mem::{transmute, ManuallyDrop},
|
|
|
|
|
|
|
|
ops::Range,
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
pub const TEST_TIME: u128 = (u64::MAX / sizeof!(u64) as u64) as _;
|
|
|
|
pub const TEST_TIME: u128 = (u64::MAX / sizeof!(u64) as u64) as _;
|
|
|
@ -59,22 +56,13 @@ pub const TEST_TIME: u128 = (u64::MAX / sizeof!(u64) as u64) as _;
|
|
|
|
header utils
|
|
|
|
header utils
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
pub trait HeaderV1Enumeration {
|
|
|
|
|
|
|
|
/// the maximum value of this enumeration
|
|
|
|
|
|
|
|
const MAX: u8;
|
|
|
|
|
|
|
|
/// Create a new enumeration, given that the maximum is validated
|
|
|
|
|
|
|
|
unsafe fn new(x: u8) -> Self;
|
|
|
|
|
|
|
|
/// Return the 1B repr of the enumeration
|
|
|
|
|
|
|
|
fn repr_u8(&self) -> u8;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// A trait that enables customizing the SDSS header for a specific version tuple
|
|
|
|
/// A trait that enables customizing the SDSS header for a specific version tuple
|
|
|
|
pub trait HeaderV1Spec {
|
|
|
|
pub trait HeaderV1Spec {
|
|
|
|
// types
|
|
|
|
// types
|
|
|
|
/// The file class type
|
|
|
|
/// The file class type
|
|
|
|
type FileClass: HeaderV1Enumeration + Copy + PartialEq;
|
|
|
|
type FileClass: TaggedEnum<Dscr = u8> + Copy + PartialEq;
|
|
|
|
/// The file specifier type
|
|
|
|
/// The file specifier type
|
|
|
|
type FileSpecifier: HeaderV1Enumeration + Copy + PartialEq;
|
|
|
|
type FileSpecifier: TaggedEnum<Dscr = u8> + Copy + PartialEq;
|
|
|
|
// constants
|
|
|
|
// constants
|
|
|
|
/// The server version to use during encode
|
|
|
|
/// The server version to use during encode
|
|
|
|
///
|
|
|
|
///
|
|
|
@ -232,8 +220,8 @@ impl<H: HeaderV1Spec> HeaderV1<H> {
|
|
|
|
ret[Self::SEG2_REC1_HOST_PTR_WIDTH] = HostPointerWidth::new().value_u8();
|
|
|
|
ret[Self::SEG2_REC1_HOST_PTR_WIDTH] = HostPointerWidth::new().value_u8();
|
|
|
|
ret[Self::SEG2_REC1_HOST_ENDIAN] = HostEndian::new().value_u8();
|
|
|
|
ret[Self::SEG2_REC1_HOST_ENDIAN] = HostEndian::new().value_u8();
|
|
|
|
// 2.1.3
|
|
|
|
// 2.1.3
|
|
|
|
ret[Self::SEG2_REC1_FILE_CLASS] = file_class.repr_u8();
|
|
|
|
ret[Self::SEG2_REC1_FILE_CLASS] = file_class.dscr();
|
|
|
|
ret[Self::SEG2_REC1_FILE_SPECIFIER] = file_specifier.repr_u8();
|
|
|
|
ret[Self::SEG2_REC1_FILE_SPECIFIER] = file_specifier.dscr();
|
|
|
|
ret[Self::SEG2_REC1_FILE_SPECIFIER_VERSION]
|
|
|
|
ret[Self::SEG2_REC1_FILE_SPECIFIER_VERSION]
|
|
|
|
.copy_from_slice(&file_specifier_version.little_endian());
|
|
|
|
.copy_from_slice(&file_specifier_version.little_endian());
|
|
|
|
// 2.2
|
|
|
|
// 2.2
|
|
|
@ -321,8 +309,8 @@ impl<H: HeaderV1Spec> HeaderV1<H> {
|
|
|
|
raw_host_ptr_width <= HostPointerWidth::MAX,
|
|
|
|
raw_host_ptr_width <= HostPointerWidth::MAX,
|
|
|
|
raw_host_endian <= HostEndian::MAX,
|
|
|
|
raw_host_endian <= HostEndian::MAX,
|
|
|
|
// 2.1.3
|
|
|
|
// 2.1.3
|
|
|
|
raw_file_class <= H::FileClass::MAX,
|
|
|
|
raw_file_class <= H::FileClass::MAX_DSCR,
|
|
|
|
raw_file_specifier <= H::FileSpecifier::MAX,
|
|
|
|
raw_file_specifier <= H::FileSpecifier::MAX_DSCR,
|
|
|
|
);
|
|
|
|
);
|
|
|
|
if okay {
|
|
|
|
if okay {
|
|
|
|
Ok(unsafe {
|
|
|
|
Ok(unsafe {
|
|
|
@ -334,13 +322,13 @@ impl<H: HeaderV1Spec> HeaderV1<H> {
|
|
|
|
raw_server_version,
|
|
|
|
raw_server_version,
|
|
|
|
raw_driver_version,
|
|
|
|
raw_driver_version,
|
|
|
|
// 2.1.2
|
|
|
|
// 2.1.2
|
|
|
|
transmute(raw_host_os),
|
|
|
|
HostOS::from_raw(raw_host_os),
|
|
|
|
transmute(raw_host_arch),
|
|
|
|
HostArch::from_raw(raw_host_arch),
|
|
|
|
transmute(raw_host_ptr_width),
|
|
|
|
HostPointerWidth::from_raw(raw_host_ptr_width),
|
|
|
|
transmute(raw_host_endian),
|
|
|
|
HostEndian::from_raw(raw_host_endian),
|
|
|
|
// 2.1.3
|
|
|
|
// 2.1.3
|
|
|
|
H::FileClass::new(raw_file_class),
|
|
|
|
H::FileClass::from_raw(raw_file_class),
|
|
|
|
H::FileSpecifier::new(raw_file_specifier),
|
|
|
|
H::FileSpecifier::from_raw(raw_file_specifier),
|
|
|
|
raw_file_specifier_version,
|
|
|
|
raw_file_specifier_version,
|
|
|
|
// 2.2
|
|
|
|
// 2.2
|
|
|
|
raw_runtime_epoch_time,
|
|
|
|
raw_runtime_epoch_time,
|
|
|
|