Skip to content

Commit 4591237

Browse files
committed
wip
1 parent caeca9a commit 4591237

File tree

9 files changed

+507
-489
lines changed

9 files changed

+507
-489
lines changed

src/bin/unsquashfs.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use std::process::ExitCode;
99
use backhand::kind::Kind;
1010
use backhand::{
1111
BufReadSeek, FilesystemReader, InnerNode, Node, NodeHeader, Squashfs, SquashfsBlockDevice,
12-
SquashfsCharacterDevice, SquashfsDir, SquashfsFileReader, SquashfsSymlink,
12+
SquashfsCharacterDevice, SquashfsDir, SquashfsFileReader, SquashfsSymlink, SuperBlock_V4_0,
1313
};
1414
use clap::builder::PossibleValuesParser;
1515
use clap::{CommandFactory, Parser};
@@ -108,6 +108,7 @@ struct Args {
108108
"be_v4_0",
109109
"le_v4_0",
110110
"avm_be_v4_0",
111+
"le_v3_0",
111112
]
112113
))]
113114
kind: String,
@@ -202,7 +203,7 @@ fn stat(args: Args, mut file: BufReader<File>, kind: Kind) {
202203
file.seek(SeekFrom::Start(args.offset)).unwrap();
203204
let mut reader: Box<dyn BufReadSeek> = Box::new(file);
204205
let (superblock, compression_options) =
205-
Squashfs::superblock_and_compression_options(&mut reader, &kind).unwrap();
206+
SuperBlock_V4_0::superblock_and_compression_options(&mut reader, &kind).unwrap();
206207

207208
// show info about flags
208209
println!("{superblock:#08x?}");

src/entry.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use crate::inode::{
1212
};
1313
use crate::kinds::Kind;
1414
use crate::metadata::MetadataWriter;
15-
use crate::squashfs::SuperBlock;
15+
use crate::squashfs::{SuperBlock, SuperBlock_V4_0};
1616
use crate::{NodeHeader, SquashfsBlockDevice, SquashfsCharacterDevice, SquashfsSymlink};
1717

1818
#[derive(Clone)]
@@ -42,7 +42,7 @@ impl<'a> Entry<'a> {
4242
file_size: usize,
4343
block_offset: u16,
4444
block_index: u32,
45-
superblock: &SuperBlock,
45+
superblock: &SuperBlock_V4_0,
4646
kind: &Kind,
4747
) -> Self {
4848
// if entry won't fit in file_size of regular dir entry, create extended directory
@@ -96,7 +96,7 @@ impl<'a> Entry<'a> {
9696
inode_writer: &mut MetadataWriter,
9797
file_size: usize,
9898
added: &Added,
99-
superblock: &SuperBlock,
99+
superblock: &SuperBlock_V4_0,
100100
kind: &Kind,
101101
) -> Self {
102102
let basic_file = match added {
@@ -143,7 +143,7 @@ impl<'a> Entry<'a> {
143143
symlink: &SquashfsSymlink,
144144
inode: u32,
145145
inode_writer: &mut MetadataWriter,
146-
superblock: &SuperBlock,
146+
superblock: &SuperBlock_V4_0,
147147
kind: &Kind,
148148
) -> Self {
149149
let link = symlink.link.as_os_str().as_bytes();
@@ -170,7 +170,7 @@ impl<'a> Entry<'a> {
170170
char_device: &SquashfsCharacterDevice,
171171
inode: u32,
172172
inode_writer: &mut MetadataWriter,
173-
superblock: &SuperBlock,
173+
superblock: &SuperBlock_V4_0,
174174
kind: &Kind,
175175
) -> Self {
176176
let char_inode = Inode::new(
@@ -195,7 +195,7 @@ impl<'a> Entry<'a> {
195195
block_device: &SquashfsBlockDevice,
196196
inode: u32,
197197
inode_writer: &mut MetadataWriter,
198-
superblock: &SuperBlock,
198+
superblock: &SuperBlock_V4_0,
199199
kind: &Kind,
200200
) -> Self {
201201
let block_inode = Inode::new(

src/filesystem/writer.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use crate::kind::Kind;
2222
use crate::kinds::LE_V4_0;
2323
use crate::metadata::{self, MetadataWriter, METADATA_MAXSIZE};
2424
use crate::reader::WriteSeek;
25-
use crate::squashfs::{Flags, SuperBlock};
25+
use crate::squashfs::{Flags, SuperBlock, SuperBlock_V4_0};
2626
use crate::{
2727
fragment, FilesystemReader, Node, NodeHeader, SquashfsBlockDevice, SquashfsCharacterDevice,
2828
SquashfsDir, SquashfsFileWriter, DEFAULT_BLOCK_SIZE, DEFAULT_PAD_LEN, MAX_BLOCK_SIZE,
@@ -416,7 +416,7 @@ impl<'a> FilesystemWriter<'a> {
416416
&mut self,
417417
w: &mut W,
418418
offset: u64,
419-
) -> Result<(SuperBlock, u64), BackhandError> {
419+
) -> Result<(SuperBlock_V4_0, u64), BackhandError> {
420420
let mut writer = WriterWithOffset::new(w, offset)?;
421421
self.write(&mut writer)
422422
}
@@ -476,7 +476,7 @@ impl<'a> FilesystemWriter<'a> {
476476
dir_writer: &'_ mut MetadataWriter,
477477
parent_node_id: u32,
478478
node_id: NonZeroUsize,
479-
superblock: &SuperBlock,
479+
superblock: &SuperBlock_V4_0,
480480
kind: &Kind,
481481
) -> Result<Entry<'b>, BackhandError> {
482482
let node = &self.root.node(node_id).unwrap();
@@ -596,8 +596,9 @@ impl<'a> FilesystemWriter<'a> {
596596
pub fn write<W: Write + Seek>(
597597
&mut self,
598598
w: &mut W,
599-
) -> Result<(SuperBlock, u64), BackhandError> {
600-
let mut superblock = SuperBlock::new(
599+
) -> Result<(SuperBlock_V4_0, u64), BackhandError> {
600+
// TODO: support v3
601+
let mut superblock = SuperBlock_V4_0::new(
601602
self.fs_compressor.id,
602603
Kind {
603604
inner: self.kind.inner.clone(),
@@ -709,7 +710,7 @@ impl<'a> FilesystemWriter<'a> {
709710
fn finalize<W: Write + Seek>(
710711
&self,
711712
w: &mut W,
712-
superblock: &mut SuperBlock,
713+
superblock: &mut SuperBlock_V4_0,
713714
) -> Result<u64, BackhandError> {
714715
superblock.bytes_used = w.stream_position()?;
715716

src/inode.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use crate::dir::DirectoryIndex;
1111
use crate::entry::Entry;
1212
use crate::kind::Kind;
1313
use crate::metadata::MetadataWriter;
14-
use crate::squashfs::SuperBlock;
14+
use crate::squashfs::{SuperBlock, SuperBlock_V4_0, SuperBlockTrait};
1515
use crate::NodeHeader;
1616

1717
#[derive(Debug, DekuRead, DekuWrite, Clone, PartialEq, Eq)]
@@ -34,16 +34,16 @@ impl Inode {
3434
&self,
3535
name: &'a [u8],
3636
m_writer: &mut MetadataWriter,
37-
superblock: &SuperBlock,
37+
superblock: &SuperBlock_V4_0,
3838
kind: &Kind,
3939
) -> Entry<'a> {
4040
let mut v = BitVec::<u8, Msb0>::new();
4141
self.write(
4242
&mut v,
4343
(
4444
0xffff_ffff_ffff_ffff, // bytes_used is unused for ctx. set to max
45-
superblock.block_size,
46-
superblock.block_log,
45+
u32::try_from(superblock.block_size()).unwrap(),
46+
superblock.block_log(),
4747
kind.inner.type_endian,
4848
),
4949
)

src/kinds.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ impl Kind {
150150
"avm_be_v4_0" => AVM_BE_V4_0,
151151
"be_v4_0" => BE_V4_0,
152152
"le_v4_0" => LE_V4_0,
153+
"le_v3_0" => LE_V3_0,
153154
_ => return Err("not a valid kind".to_string()),
154155
};
155156

@@ -273,3 +274,13 @@ pub const AVM_BE_V4_0: InnerKind<dyn CompressionAction> = InnerKind {
273274
version_minor: 0,
274275
compressor: &DefaultCompressor,
275276
};
277+
278+
/// TODO:
279+
pub const LE_V3_0: InnerKind<dyn CompressionAction> = InnerKind {
280+
magic: *b"hsqs",
281+
type_endian: deku::ctx::Endian::Little,
282+
data_endian: deku::ctx::Endian::Little,
283+
version_major: 3,
284+
version_minor: 0,
285+
compressor: &DefaultCompressor,
286+
};

src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ mod inode;
6565
mod kinds;
6666
mod metadata;
6767
mod reader;
68+
mod reader_v4;
6869
mod squashfs;
6970

7071
pub use crate::data::DataSize;
@@ -83,7 +84,7 @@ pub use crate::id::Id;
8384
pub use crate::inode::{BasicFile, Inode};
8485
pub use crate::reader::BufReadSeek;
8586
pub use crate::squashfs::{
86-
Squashfs, SuperBlock, DEFAULT_BLOCK_SIZE, DEFAULT_PAD_LEN, MAX_BLOCK_SIZE, MIN_BLOCK_SIZE,
87+
Squashfs, SuperBlock, SuperBlock_V4_0, DEFAULT_BLOCK_SIZE, DEFAULT_PAD_LEN, MAX_BLOCK_SIZE, MIN_BLOCK_SIZE,
8788
};
8889

8990
/// Support the wonderful world of vendor formats

src/metadata.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use deku::bitvec::{BitVec, BitView};
44
use deku::prelude::*;
55
use tracing::{instrument, trace};
66

7+
use crate::compression::Compressor;
78
use crate::error::BackhandError;
89
use crate::filesystem::writer::FilesystemCompressor;
910
use crate::kinds::Kind;
@@ -98,7 +99,7 @@ impl Write for MetadataWriter {
9899
#[instrument(skip_all)]
99100
pub fn read_block<R: Read + ?Sized>(
100101
reader: &mut R,
101-
superblock: &SuperBlock,
102+
compressor: Compressor,
102103
kind: &Kind,
103104
) -> Result<Vec<u8>, BackhandError> {
104105
let mut buf = [0u8; 2];
@@ -118,7 +119,7 @@ pub fn read_block<R: Read + ?Sized>(
118119
let mut out = Vec::with_capacity(8 * 1024);
119120
kind.inner
120121
.compressor
121-
.decompress(&buf, &mut out, superblock.compressor)?;
122+
.decompress(&buf, &mut out, compressor)?;
122123
out
123124
} else {
124125
tracing::trace!("uncompressed");

0 commit comments

Comments
 (0)