# GitHub Releases for wcampbell0x2a$ ls -lh releases -rw-r--r-- 1 Jan 18 2026 wcampbell0x2a/backhand v0.24.1 -rw-r--r-- 1 Jan 15 2026 sharksforarms/deku deku-v0.20.3 -rw-r--r-- 1 Jan 14 2026 wcampbell0x2a/compact-calendar-cli v0.2.0 -rw-r--r-- 1 Jan 06 2026 wcampbell0x2a/outsider v0.4.1 -rw-r--r-- 1 Jan 06 2026 wcampbell0x2a/outsider v0.4.0 -rw-r--r-- 1 Jan 04 2026 wcampbell0x2a/statusbar v0.5.0 -rw-r--r-- 1 Dec 31 2025 wcampbell0x2a/ratatui-style-ayu v0.3.0 -rw-r--r-- 1 Dec 31 2025 wcampbell0x2a/ratatui-style-ayu v0.2.0 -rw-r--r-- 1 Dec 29 2025 wcampbell0x2a/no-std-io2 v0.9.3 -rw-r--r-- 1 Dec 29 2025 wcampbell0x2a/compact-calendar-cli v0.1.0 -rw-r--r-- 1 Dec 22 2025 wcampbell0x2a/librarium v0.5.0 -rw-r--r-- 1 Dec 22 2025 wcampbell0x2a/test-assets-ureq v0.6.0 -rw-r--r-- 1 Dec 16 2025 wcampbell0x2a/heretek v0.8.0 -rw-r--r-- 1 Dec 07 2025 wcampbell0x2a/backhand v0.24.0 -rw-r--r-- 1 Nov 28 2025 wcampbell0x2a/no-std-io2 v0.9.2 -rw-r--r-- 1 Nov 25 2025 sharksforarms/deku deku-v0.20.2 -rw-r--r-- 1 Nov 25 2025 sharksforarms/deku deku-v0.20.1 -rw-r--r-- 1 Nov 15 2025 wcampbell0x2a/heretek v0.7.0 -rw-r--r-- 1 Oct 15 2025 sharksforarms/deku deku-v0.20.0 -rw-r--r-- 1 Oct 12 2025 wcampbell0x2a/no-std-io2 v0.9.1 -rw-r--r-- 1 Sep 02 2025 wcampbell0x2a/heretek v0.6.0 -rw-r--r-- 1 Aug 20 2025 wcampbell0x2a/outsider v0.3.0 -rw-r--r-- 1 Jul 03 2025 wcampbell0x2a/outsider v0.2.0 -rw-r--r-- 1 Jun 20 2025 wcampbell0x2a/backhand v0.23.0 -rw-r--r-- 1 May 22 2025 sharksforarms/deku v0.19.1 -rw-r--r-- 1 May 03 2025 wcampbell0x2a/income v0.3.0 -rw-r--r-- 1 May 03 2025 wcampbell0x2a/librarium v0.4.0 -rw-r--r-- 1 May 03 2025 wcampbell0x2a/backhand v0.22.0 -rw-r--r-- 1 Apr 25 2025 sharksforarms/deku v0.19.0 -rw-r--r-- 1 Apr 15 2025 wcampbell0x2a/heretek v0.5.1 -rw-r--r-- 1 Apr 13 2025 wcampbell0x2a/outsider v0.1.2 -rw-r--r-- 1 Mar 08 2025 wcampbell0x2a/backhand v0.21.0 -rw-r--r-- 1 Feb 10 2025 wcampbell0x2a/heretek v0.5.0 -rw-r--r-- 1 Feb 10 2025 wcampbell0x2a/zerus v0.11.0 -rw-r--r-- 1 Jan 20 2025 wcampbell0x2a/test-assets-ureq v0.5.0 -rw-r--r-- 1 Jan 20 2025 wcampbell0x2a/test-assets-ureq v0.4.0 -rw-r--r-- 1 Jan 18 2025 wcampbell0x2a/backhand v0.20.0 -rw-r--r-- 1 Jan 15 2025 wcampbell0x2a/heretek v0.4.0 -rw-r--r-- 1 Jan 10 2025 wcampbell0x2a/heretek v0.3.0 -rw-r--r-- 1 Jan 04 2025 wcampbell0x2a/no-std-io2 v0.9.0 -rw-r--r-- 1 Jan 03 2025 wcampbell0x2a/heretek v0.2.0 -rw-r--r-- 1 Jan 02 2025 wcampbell0x2a/heretek v0.1.0 -rw-r--r-- 1 Dec 23 2024 wcampbell0x2a/heretek v0.1.0-rc12 -rw-r--r-- 1 Dec 18 2024 wcampbell0x2a/heretek v0.1.0-rc11 -rw-r--r-- 1 Dec 17 2024 wcampbell0x2a/heretek v0.1.0-rc10 -rw-r--r-- 1 Dec 17 2024 wcampbell0x2a/heretek v0.1.0-rc9 -rw-r--r-- 1 Dec 16 2024 wcampbell0x2a/heretek v0.1.0-rc8 -rw-r--r-- 1 Dec 12 2024 wcampbell0x2a/heretek v0.1.0-rc7 -rw-r--r-- 1 Dec 10 2024 wcampbell0x2a/heretek v0.1.0-rc6 -rw-r--r-- 1 Dec 09 2024 wcampbell0x2a/heretek v0.1.0-rc5 -rw-r--r-- 1 Dec 09 2024 wcampbell0x2a/heretek v0.1.0-rc4 -rw-r--r-- 1 Dec 06 2024 wcampbell0x2a/heretek v0.1.0-rc3 -rw-r--r-- 1 Dec 05 2024 wcampbell0x2a/heretek v0.1.0-rc2 -rw-r--r-- 1 Dec 04 2024 wcampbell0x2a/heretek v0.1.0-rc1 -rw-r--r-- 1 Dec 03 2024 wcampbell0x2a/heretek v0.1.0-rc0 -rw-r--r-- 1 Dec 01 2024 wcampbell0x2a/backhand v0.19.0 -rw-r--r-- 1 Nov 09 2024 wcampbell0x2a/librarium v0.3.1 -rw-r--r-- 1 Nov 09 2024 wcampbell0x2a/test-assets-ureq v0.3.0 -rw-r--r-- 1 Nov 09 2024 wcampbell0x2a/librarium v0.3.0 -rw-r--r-- 1 Oct 25 2024 wcampbell0x2a/kokiri v0.1.2 -rw-r--r-- 1 Oct 25 2024 wcampbell0x2a/kokiri v0.1.1 -rw-r--r-- 1 Oct 25 2024 wcampbell0x2a/aftermath v0.1.1 -rw-r--r-- 1 Oct 25 2024 wcampbell0x2a/aftermath v0.1.0 -rw-r--r-- 1 Oct 25 2024 wcampbell0x2a/kokiri v0.1.0 -rw-r--r-- 1 Oct 25 2024 wcampbell0x2a/zerus v0.10.1 -rw-r--r-- 1 Oct 22 2024 wcampbell0x2a/income v0.2.0 -rw-r--r-- 1 Oct 22 2024 wcampbell0x2a/zerus v0.10.0 -rw-r--r-- 1 Oct 12 2024 wcampbell0x2a/no-std-io2 v0.8.1 -rw-r--r-- 1 Oct 12 2024 wcampbell0x2a/zerus v0.9.0 -rw-r--r-- 1 Sep 27 2024 wcampbell0x2a/librarium v0.2.0 -rw-r--r-- 1 Sep 07 2024 sharksforarms/deku v0.18.0 -rw-r--r-- 1 May 30 2024 wcampbell0x2a/zerus v0.8.1 -rw-r--r-- 1 May 30 2024 wcampbell0x2a/zerus v0.8.0 -rw-r--r-- 1 May 25 2024 wcampbell0x2a/backhand v0.18.0 -rw-r--r-- 1 May 24 2024 sharksforarms/deku v0.17.0 -rw-r--r-- 1 May 06 2024 wcampbell0x2a/backhand v0.17.0 -rw-r--r-- 1 Apr 26 2024 wcampbell0x2a/backhand v0.16.0 -rw-r--r-- 1 Apr 11 2024 wcampbell0x2a/zerus v0.7.0 -rw-r--r-- 1 Mar 24 2024 wcampbell0x2a/backhand v0.15.0 -rw-r--r-- 1 Feb 26 2024 wcampbell0x2a/zerus v0.6.0 -rw-r--r-- 1 Feb 11 2024 wcampbell0x2a/bintex v0.1.0 -rw-r--r-- 1 Feb 09 2024 wcampbell0x2a/asterix-rs v0.4.0 -rw-r--r-- 1 Feb 03 2024 wcampbell0x2a/zerus v0.5.0 -rw-r--r-- 1 Jan 20 2024 wcampbell0x2a/dbg_hex v0.2.0 -rw-r--r-- 1 Jan 17 2024 wcampbell0x2a/backhand v0.14.2 -rw-r--r-- 1 Jan 14 2024 wcampbell0x2a/backhand v0.14.1 -rw-r--r-- 1 Jan 13 2024 wcampbell0x2a/backhand v0.14.0 -rw-r--r-- 1 Dec 13 2023 wcampbell0x2a/mempeek v0.1.5 -rw-r--r-- 1 Oct 14 2023 wcampbell0x2a/asterix-rs v0.3.1 -rw-r--r-- 1 Sep 17 2023 wcampbell0x2a/assert_hex v0.4.1 -rw-r--r-- 1 Sep 11 2023 wcampbell0x2a/statusbar v0.3.5 -rw-r--r-- 1 Sep 11 2023 wcampbell0x2a/assert_hex v0.4.0 -rw-r--r-- 1 Jun 19 2023 wcampbell0x2a/backhand v0.13.0 -rw-r--r-- 1 May 07 2023 wcampbell0x2a/backhand v0.12.0 -rw-r--r-- 1 Apr 15 2023 wcampbell0x2a/statusbar v0.3.4 -rw-r--r-- 1 Apr 05 2023 wcampbell0x2a/statusbar v0.3.3 -rw-r--r-- 1 Mar 29 2023 wcampbell0x2a/statusbar v0.3.2 -rw-r--r-- 1 Mar 15 2023 wcampbell0x2a/backhand v0.11.0 -rw-r--r-- 1 Feb 23 2023 wcampbell0x2a/backhand v0.10.1 -rw-r--r-- 1 Feb 21 2023 wcampbell0x2a/backhand v0.10.0 -rw-r--r-- 1 Feb 16 2023 wcampbell0x2a/backhand v0.9.1 -rw-r--r-- 1 Feb 14 2023 wcampbell0x2a/backhand v0.9.0 -rw-r--r-- 1 Feb 12 2023 wcampbell0x2a/backhand v0.8.1 -rw-r--r-- 1 Feb 12 2023 wcampbell0x2a/backhand v0.8.0 -rw-r--r-- 1 Feb 03 2023 wcampbell0x2a/zerus v0.4.0 -rw-r--r-- 1 Jan 24 2023 wcampbell0x2a/backhand v0.7.0 -rw-r--r-- 1 Jan 11 2023 wcampbell0x2a/backhand v0.6.0 -rw-r--r-- 1 Jan 09 2023 wcampbell0x2a/backhand v0.5.0 -rw-r--r-- 1 Dec 30 2022 wcampbell0x2a/statusbar v0.3.1 -rw-r--r-- 1 Dec 30 2022 wcampbell0x2a/zerus v0.3.0 -rw-r--r-- 1 Sep 30 2022 wcampbell0x2a/statusbar v0.3.0 -rw-r--r-- 1 Sep 30 2022 wcampbell0x2a/statusbar v0.2.0 -rw-r--r-- 1 Sep 30 2022 wcampbell0x2a/statusbar v0.1.1 -rw-r--r-- 1 Sep 29 2022 wcampbell0x2a/statusbar v0.1.0 -rw-r--r-- 1 Aug 07 2022 wcampbell0x2a/zerus v0.2.0 -rw-r--r-- 1 Jul 28 2022 wcampbell0x2a/zerus v0.1.0
## wcampbell0x2a/backhand
### v0.24.1Published: 2026-01-18 18:59:20 UTC | Tag:
v0.24.1
backhand
- Add a method to create an XzFilter, thanks @h4dynn.
- impl Seek for SquashfsReadFile, thanks @AMZN-hgoffin.
- Update dependencies
backhand-cli
- Update dependencies
## wcampbell0x2a/compact-calendar-cli
### v0.2.0Published: 2026-01-14 01:33:01 UTC | Tag:
v0.2.0
- Center title
- Add optional
--month [n,month_name,current]- Add optional
--following-months [n]- Restore default handle for SIGPIPE
- Print all events on week range on same row
![]()
## wcampbell0x2a/outsider
### v0.4.1Published: 2026-01-06 13:14:19 UTC | Tag:
v0.4.1
- Require
--projectif multiple yaml projects are detected- Require
--source-dirifartifacts.ymlis detected as being in the current dir- Add example of using
--source-dirin the README
### v0.4.0Published: 2026-01-06 04:56:38 UTC | Tag:
v0.4.0
- Default
YML_FILEtoartifacts.yml- Improve help and explain where files are copied
- Ignore unused yml fields to support new fields from art: v0.5.0 and onward
## wcampbell0x2a/statusbar
### v0.5.0Published: 2026-01-04 15:38:32 UTC | Tag:
v0.5.0
- Update RAM usage calculation to use Ram Available
- Add PWR display (charging and discharge watt usage)
- Add wifi ssid if available
- Update code
- Update depends
- Update ci
## wcampbell0x2a/ratatui-style-ayu
### v0.3.0Published: 2025-12-31 18:33:10 UTC | Tag:
v0.3.0
- Fix colors
- Add ayu dark from helix
- Add ayu dark from heretek
### v0.2.0Published: 2025-12-31 17:28:50 UTC | Tag:
v0.2.0
- Initial Release
## wcampbell0x2a/no-std-io2
### v0.9.3Published: 2025-12-29 20:14:08 UTC | Tag:
v0.9.3What's Changed
- Add Seek stream_position by @wcampbell0x2a in https://github.com/wcampbell0x2a/no-std-io2/pull/25
Full Changelog: https://github.com/wcampbell0x2a/no-std-io2/compare/v0.9.2...v0.9.3
## wcampbell0x2a/compact-calendar-cli
### v0.1.0Published: 2025-12-29 18:53:05 UTC | Tag:
v0.1.0Initial Release
![]()
## wcampbell0x2a/librarium
### v0.5.0Published: 2025-12-22 22:55:29 UTC | Tag:
v0.5.0
- Update deku to v0.20.2
- Add multi-threaded file retrieval
- Add progress and status bar to dl
- Add no_std support with std features
## wcampbell0x2a/test-assets-ureq
### v0.6.0Published: 2025-12-22 03:50:15 UTC | Tag:
v0.6.0
- Multi-threaded downloads
dlnow includes progress bar- Add tests
## wcampbell0x2a/heretek
### v0.8.0Published: 2025-12-16 02:17:15 UTC | Tag:
v0.8.0
- Add
Sourceimprovements:
- Add
Sourcedisplay page- Add
Sourcehighlight support for Rust, C, and C++ using arborium (treesitter).- Send child process stderr to null
- Resolve info addresses with another symbol address lookup in
Symbolpage.- Poll slower when not expecting gdb response
## wcampbell0x2a/backhand
### v0.24.0Published: 2025-12-07 04:32:25 UTC | Tag:
v0.24.0[v0.24.0] - 2025-12-06
backhand
- Add Normal and Vendor SquashFS 3.0 Read support. This has been a long time coming, and required many under-the-hood changes. Just as before, these are all featured in the kind module. When lzma settings cannot be determined from the file, backhand falls back to the https://github.com/wcampbell0x2a/lzma-adaptive-sys bindings (based on sasquatch's LZMA adaptive library).
Kinds:
be_v3_0le_v3_0be_v3_0_lzmale_v3_0_lzmanetgear_be_v3_0_lzmanetgear_le_v3_0_lzmaFeatures:
v3v3_lzmaAs always, if you find a SquashFS v3.0 that our tools can't use, let me know!
- Update to 2024 edition
- Bump MSRV to 1.86
- Change
FilesystemReader::files()to return an iterator instead ofVec
backhand-cli
- unsquashfs: Try all kinds by default when
--kindisn't specified- unsquashfs: Improve error output
- Update to 2024 edition
- Bump MSRV to 1.86
## wcampbell0x2a/no-std-io2
### v0.9.2Published: 2025-11-28 14:15:19 UTC | Tag:
v0.9.2What's Changed
- Add
Box<Read>,Box<Write>,Box<Seek>,Box<BufRead>by @wcampbell0x2a in https://github.com/wcampbell0x2a/no-std-io2/pull/22Full Changelog: https://github.com/wcampbell0x2a/no-std-io2/compare/v0.9.1...v0.9.2
## sharksforarms/deku
### deku-v0.20.2Published: 2025-11-25 21:34:17 UTC | Tag:
deku-v0.20.2Other
- Fix recursive DekuSize impl (#628)
### deku-v0.20.1Published: 2025-11-25 01:58:48 UTC | Tag:
deku-v0.20.1
## sharksforarms/deku
### deku-v0.20.0Published: 2025-10-15 20:17:57 UTC | Tag:
deku-v0.20.0Fixed
- remove unsafe slice MaybeUninit::uninit().assume_init() (#601)
Added
- The
allocfeature, allowing use in environments lacking a heap #582- The
descriptive-errorsfeature, replacingno-assertion-string#582Other
- update deps (#612)
- Fix #571: Add more documentation about ctx in the first example (#574)
- introduce release-plz
- Fix reading little endian fields in LSB order when not aligned to byte boundaries (#604)
- Ensure bits fit in container (#598)
- Fix big endian bit_order lsb writing (#597)
- Improve error message for id_type and missing repr (#596)
- Fix bit order padding logic in Writer::finalize and update tests (#595)
- Expose
allocas a selectable feature (#582)- Removed duplicate
bitsentry from the 'List of attributes' section of attributes docs (#588)- Fix DekuRead for #[repr(...)] enums constructed using
idviactxand whose variants assign discriminant values (#577)- Change arc/cow/cstring requirements from std to alloc (#579)
- deku_read: Use checked slice for remaining data (#581)
- Implements From
for no_std_io::io::Error in no_std context (#578) - Warnings and clippy fixes (#575)
- hashset: tests: Handle arbitrary iteration order of HashSet (#573)
- add map attribute to list (#570)
- Return empty vec for read_to_end ZST (#566)
- Bugfix/signed values in bitfields (#565)
- Fix writer dropping count of bytes written for unaligned writes (#561)
- Fix CString byte length reading (#563)
## wcampbell0x2a/no-std-io2
### v0.9.1Published: 2025-10-12 19:27:57 UTC | Tag:
v0.9.1
- Fix BufWriter panic #19
## wcampbell0x2a/outsider
### v0.3.0Published: 2025-08-20 20:57:09 UTC | Tag:
v0.3.0
- Error when no files are moved / projects are processed
- Fix source-dir still being required with a default value
### v0.2.0Published: 2025-07-03 23:17:18 UTC | Tag:
v0.2.0
- Default
--source-dirto.
## wcampbell0x2a/backhand
### v0.23.0Published: 2025-06-20 04:01:44 UTC | Tag:
v0.23.0
backhand
- Add feature
parallel, which enables internal parallelization when de-compressing data. Whenparallelis not used, the old behavior of reading without parallelization is used. (#716)
- This substantially increases the speed of backhand-unsquashfs, removing about half of the wall time! See the new benchmarks for details.
- Fix misaligned pointer loads when using Deku. thanks @bdash! (#713)
- Fix incorrect assertion about file size (#730)
- Use rust library
liblzmainstead ofxz2. This bumps the version of XZ used to 5.8.1. (#712)
- This also removes the need for
HAVE_DECODERdefines/CFLAGS when building xz, asliblzmaenables them when building by default.
backhand-cli
- unsquashfs: Properly flush the file writer
backhand-cli
- Use
backhandfeaturesparallelby default (and in release builds). Exposed by usingbackhand-parallel.
## sharksforarms/deku
### v0.19.1Published: 2025-05-22 14:48:57 UTC | Tag:
deku-v0.19.1What's Changed
- Add missing alloc::vec by @wcampbell0x2a in https://github.com/sharksforarms/deku/pull/550
- fix: fix and test of conditional fields depending on conditional fields by @goto40 in https://github.com/sharksforarms/deku/pull/555
- Support ipaddr in no-std by @wcampbell0x2a in https://github.com/sharksforarms/deku/pull/557
- Force repr attribute required for enum discr by @wcampbell0x2a in https://github.com/sharksforarms/deku/pull/554
- Prep release 0.19.1 by @sharksforarms in https://github.com/sharksforarms/deku/pull/559
Full Changelog: https://github.com/sharksforarms/deku/compare/deku-v0.19.0...deku-v0.19.1
## wcampbell0x2a/income
### v0.3.0Published: 2025-05-03 15:17:01 UTC | Tag:
v0.3.0
- Update deku to 0.19.0
## wcampbell0x2a/librarium
### v0.4.0Published: 2025-05-03 13:47:05 UTC | Tag:
v0.4.0
- Update deku to v0.19.0 (https://github.com/wcampbell0x2a/librarium/pull/58)
## sharksforarms/deku
### v0.19.0Published: 2025-04-25 18:55:42 UTC | Tag:
deku-v0.19.0Features
Added
bit_order(#483)After much development,
bit_orderis now a supported attribute!Msbis still the default bit-order for all operations, but if you needLsbordering, deku now has you covered.For example, the following is now possible:
# #[derive(Debug, DekuRead, DekuWrite, PartialEq)] #[deku(bit_order = "lsb")] // <-- pub struct SquashfsV3 { #[deku(bits = "4")] inode_type: u8, #[deku(bits = "12")] mode: u16, uid: u8, guid: u8, mtime: u32, inode_number: u32, } let data: &[u8] = &[ // inode_type // ╭----------- // | // | mode // ╭+-------- ...and so on // || || // vv vv 0x31, 0x12, 0x04, 0x05, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, ];If you were using our internal
readerthe following changed. As well as theleftoverfield now containing ordering.- reader.read_bytes(exact.0, &mut bytes)?; + reader.read_bytes(exact.0, &mut bytes, Order::Lsb0)?;Added bytes ctx for
CString(#497)#[derive(PartialEq, Debug, DekuRead, DekuWrite)] pub struct Data { len: u8, #[deku(bytes = "*len as usize")] s: CString, }Changed
id_pat(#540)The
id_patattribute has been restored to the behavior of0.16.0, removing the seek and re-read.Allow token streams for
bytesattribute (#489)# #[derive(Debug, PartialEq, DekuRead, DekuWrite)] struct DekuTest { field_a_size: u8, #[deku(bytes = "*field_a_size as usize")] field_a: u32, }Updates
Arcsupport by @vhdirk (#522)- Update
no-std-io2to 0.9.0 and UpdatedMSRVto1.81(#529)- Add field support for
magicattribute (#503)- Add
NoSeektype for unseekableRead+Writeimpls (#487)- Add performance specializations for
countattribute +Vec<u8>(#481)Readermay now take ownership ofRead + Seektype. Thanks @wgreenburg (#521).Fixes
## wcampbell0x2a/heretek
### v0.5.1Published: 2025-04-15 01:26:58 UTC | Tag:
v0.5.1
- Support reading memory map from gdb >= 16.2 https://github.com/wcampbell0x2a/heretek/pull/141
## wcampbell0x2a/heretek
### v0.5.0Published: 2025-02-10 04:02:43 UTC | Tag:
v0.5.0
- Add
Tabcompletion to show possible completions and overwrite if singular #134- Show
-stack-list-framesotherwise known asBacktracewhen available #129- Add more documentation showing more usage of
heretekin Hexdump and Normal usage #128- Try and deref the entire string when looking at a memory address #127
- Update depends
## wcampbell0x2a/zerus
### v0.11.0Published: 2025-02-10 03:51:22 UTC | Tag:
v0.11.0
- Add
-Vfor version, and about text to help output- Add instructions for using https://github.com/rust-lang/rust-playground
- Update depends
## wcampbell0x2a/test-assets-ureq
### v0.5.0Published: 2025-01-20 02:18:59 UTC | Tag:
v0.5.0
### v0.4.0Published: 2025-01-20 01:58:32 UTC | Tag:
v0.4.0What's Changed
- Add downloading assets from file by @wcampbell0x2a in https://github.com/wcampbell0x2a/test-assets-ureq/pull/5
Full Changelog: https://github.com/wcampbell0x2a/test-assets-ureq/compare/v0.3.0...v0.4.0
## wcampbell0x2a/heretek
### v0.4.0Published: 2025-01-15 04:59:04 UTC | Tag:
v0.4.0
- Display registers that point to addresses in Hexdump #115
- Show asm and function offset in asm deref #117
- Expand
HERETEK_MAPPING_{START,END,LEN}to allow optional index of mapping #116- Fix
HERETEK_MAPPING_{START,END,LEN}to allow all ascii chars as filename #116- Add
--cmdsto cmd history #118- Ignore
#comment lines in--cmds#119
### v0.3.0Published: 2025-01-10 03:52:59 UTC | Tag:
v0.3.0
- Adjusted size of UI elements in Main View #102
- Add
--gdb-pathto override gdb executated #101- Show
Runningin status #106- Allow
control+cto sendSIGINTto process #106
- Always use
mi-async- Override
continueinto-exec-continue- Override
stepiinto-exec-step-instruction- Override
stepinto-exec-step- Change
--cmdinto--cmdsand from usinggdb> sourceto just running each line as a gdb cmd #106- Add
--log-pathto control log location and remove writing toapp.logby default #108- Change
RUST_LOGenv toinfoas default #108
## wcampbell0x2a/heretek
### v0.2.0Published: 2025-01-03 04:36:04 UTC | Tag:
v0.2.0
### v0.1.0Published: 2025-01-02 02:26:10 UTC | Tag:
v0.1.0Initial Release
### v0.1.0-rc12Published: 2024-12-23 02:10:20 UTC | Tag:
v0.1.0-rc12
### v0.1.0-rc11Published: 2024-12-18 01:02:41 UTC | Tag:
v0.1.0-rc11
### v0.1.0-rc10Published: 2024-12-17 03:42:11 UTC | Tag:
v0.1.0-rc10
### v0.1.0-rc9Published: 2024-12-17 02:23:06 UTC | Tag:
v0.1.0-rc9
### v0.1.0-rc8Published: 2024-12-16 00:45:07 UTC | Tag:
v0.1.0-rc8
### v0.1.0-rc7Published: 2024-12-12 05:14:03 UTC | Tag:
v0.1.0-rc7
### v0.1.0-rc6Published: 2024-12-10 03:38:58 UTC | Tag:
v0.1.0-rc6
### v0.1.0-rc5Published: 2024-12-09 04:03:18 UTC | Tag:
v0.1.0-rc5
### v0.1.0-rc4Published: 2024-12-09 03:57:48 UTC | Tag:
v0.1.0-rc4
### v0.1.0-rc3Published: 2024-12-06 04:35:05 UTC | Tag:
v0.1.0-rc3
### v0.1.0-rc2Published: 2024-12-05 05:41:31 UTC | Tag:
v0.1.0-rc2
### v0.1.0-rc1Published: 2024-12-04 05:01:04 UTC | Tag:
v0.1.0-rc1
### v0.1.0-rc0Published: 2024-12-03 05:26:49 UTC | Tag:
v0.1.0-rc0
## wcampbell0x2a/backhand
### v0.19.0Published: 2024-12-01 22:57:38 UTC | Tag:
v0.19.0
backhand
- Use feature
zlib-ngforflate2, which is enabled when compression optionGzipis used. This enables the backend to use zlib-ng, which is faster by default! (#562)- Remove duplicated data when addding new files to a
FilesystemWriter. This also applies this behavior to theaddandreplacebinaries. This is controllable withFilesystemWriter::set_no_duplicate_files. (#603), (#594)- Increase speed of internal
HashMaps, by switching toxxhashand just using theinodeas the key in other places.- Changed
SuperBlock::Flagsto be public.- Add non-standard CompressionOptions support (#584)
- Add
CompressionAction::compression_optionsto override the default compression options emitted during writing.- Add
FilesystemWriter::set_emit_compression_options- Support sparse file extraction (#624)
- Add
x86_64-pc-windows-gnusupport (@Wolfyxon) (#634)- Add zlib-rs support through
--feature gzip-zlib-rs.Security
- Prevent self referential dirs, which could cause a stack overflow (#624)
- Avoid high allocations for high inode count (#624)
backhand-cli
- Add
--no-compression-optionstoaddandreplaceto remove compression options from image after modification.- Add
--pad-lentoreplaceandaddto control the length of end-of-image padding (#604)- Bump MSRV to
1.77Dependencies
- Bump
thiserrorfrom 1.0.59 to 2.0.1 (#564, #578, #615, #633)- Bump
libcfrom 0.2.154 to 0.2.162 (#557, #592, #616, #630)- Bump
clapfrom 4.5.4 to 4.5.13 (#569, #574, #582)- Bump
rustc-hashfrom 1.1.0 to 2.0.0 (#570)- Bump
clap_completefrom 4.5.2 to 4.5.13 (#575, #595)- Bump
document-featuresfrom 0.2.8 to 0.2.10 (#576)- Bump
zstd-safefrom 7.1.0 to 7.2.1 (#585)- Bump
flate2from 1.0.30 to 1.0.35 (#593, #596, #617, #641)- Bump
zstdfrom 0.13.1 to 0.13.2 (#601)- Bump
env_loggerfrom 0.11.3 to 0.11.5 (#602)- Bump
libdeflaterfrom 1.21.0 to 1.22.0 (#619)- Bump
tempfilefrom 3.12.0 to 3.13.0 (#618)- Bump
nixfrom 0.28.0 to 0.29.0 (#566)Complete API Updates
Click to expand
Removed items from the public API ================================= -pub fn backhand::SuperBlock::data_has_been_duplicated(&self) -> bool Changed items in the public API =============================== -pub fn backhand::compression::CompressionOptions::from_reader_with_ctx<R: std::io::Read>(__deku_reader: &mut deku::reader::Reader<'_, R>, (endian, compressor): (deku::ctx::Endian, backhand::compression::Compressor)) -> core::result::Result<Self, deku::error::DekuError> +pub fn backhand::compression::CompressionOptions::from_reader_with_ctx<R: std::io::Read + std::io::Seek>(__deku_reader: &mut deku::reader::Reader<'_, R>, (endian, compressor): (deku::ctx::Endian, backhand::compression::Compressor)) -> core::result::Result<Self, deku::error::DekuError> -pub fn backhand::compression::CompressionOptions::to_writer<W: std::io::Write>(&self, __deku_writer: &mut deku::writer::Writer<W>, (endian, compressor): (deku::ctx::Endian, backhand::compression::Compressor)) -> core::result::Result<(), deku::error::DekuError> +pub fn backhand::compression::CompressionOptions::to_writer<W: std::io::Write + std::io::Seek>(&self, __deku_writer: &mut deku::writer::Writer<W>, (endian, compressor): (deku::ctx::Endian, backhand::compression::Compressor)) -> core::result::Result<(), deku::error::DekuError> -pub fn backhand::compression::Compressor::from_reader_with_ctx<R: std::io::Read>(__deku_reader: &mut deku::reader::Reader<'_, R>, endian: deku::ctx::Endian) -> core::result::Result<Self, deku::error::DekuError> +pub fn backhand::compression::Compressor::from_reader_with_ctx<R: std::io::Read + std::io::Seek>(__deku_reader: &mut deku::reader::Reader<'_, R>, endian: deku::ctx::Endian) -> core::result::Result<Self, deku::error::DekuError> -pub fn backhand::compression::Compressor::to_writer<W: std::io::Write>(&self, __deku_writer: &mut deku::writer::Writer<W>, endian: deku::ctx::Endian) -> core::result::Result<(), deku::error::DekuError> +pub fn backhand::compression::Compressor::to_writer<W: std::io::Write + std::io::Seek>(&self, __deku_writer: &mut deku::writer::Writer<W>, endian: deku::ctx::Endian) -> core::result::Result<(), deku::error::DekuError> -pub fn backhand::compression::Gzip::from_reader_with_ctx<R: std::io::Read>(__deku_reader: &mut deku::reader::Reader<'_, R>, endian: deku::ctx::Endian) -> core::result::Result<Self, deku::error::DekuError> +pub fn backhand::compression::Gzip::from_reader_with_ctx<R: std::io::Read + std::io::Seek>(__deku_reader: &mut deku::reader::Reader<'_, R>, endian: deku::ctx::Endian) -> core::result::Result<Self, deku::error::DekuError> -pub fn backhand::compression::Gzip::to_writer<W: std::io::Write>(&self, __deku_writer: &mut deku::writer::Writer<W>, endian: deku::ctx::Endian) -> core::result::Result<(), deku::error::DekuError> +pub fn backhand::compression::Gzip::to_writer<W: std::io::Write + std::io::Seek>(&self, __deku_writer: &mut deku::writer::Writer<W>, endian: deku::ctx::Endian) -> core::result::Result<(), deku::error::DekuError> -pub fn backhand::compression::Lz4::from_reader_with_ctx<R: std::io::Read>(__deku_reader: &mut deku::reader::Reader<'_, R>, endian: deku::ctx::Endian) -> core::result::Result<Self, deku::error::DekuError> +pub fn backhand::compression::Lz4::from_reader_with_ctx<R: std::io::Read + std::io::Seek>(__deku_reader: &mut deku::reader::Reader<'_, R>, endian: deku::ctx::Endian) -> core::result::Result<Self, deku::error::DekuError> -pub fn backhand::compression::Lz4::to_writer<W: std::io::Write>(&self, __deku_writer: &mut deku::writer::Writer<W>, endian: deku::ctx::Endian) -> core::result::Result<(), deku::error::DekuError> +pub fn backhand::compression::Lz4::to_writer<W: std::io::Write + std::io::Seek>(&self, __deku_writer: &mut deku::writer::Writer<W>, endian: deku::ctx::Endian) -> core::result::Result<(), deku::error::DekuError> -pub fn backhand::compression::Lzo::from_reader_with_ctx<R: std::io::Read>(__deku_reader: &mut deku::reader::Reader<'_, R>, endian: deku::ctx::Endian) -> core::result::Result<Self, deku::error::DekuError> +pub fn backhand::compression::Lzo::from_reader_with_ctx<R: std::io::Read + std::io::Seek>(__deku_reader: &mut deku::reader::Reader<'_, R>, endian: deku::ctx::Endian) -> core::result::Result<Self, deku::error::DekuError> -pub fn backhand::compression::Lzo::to_writer<W: std::io::Write>(&self, __deku_writer: &mut deku::writer::Writer<W>, endian: deku::ctx::Endian) -> core::result::Result<(), deku::error::DekuError> +pub fn backhand::compression::Lzo::to_writer<W: std::io::Write + std::io::Seek>(&self, __deku_writer: &mut deku::writer::Writer<W>, endian: deku::ctx::Endian) -> core::result::Result<(), deku::error::DekuError> -pub fn backhand::compression::Xz::from_reader_with_ctx<R: std::io::Read>(__deku_reader: &mut deku::reader::Reader<'_, R>, endian: deku::ctx::Endian) -> core::result::Result<Self, deku::error::DekuError> +pub fn backhand::compression::Xz::from_reader_with_ctx<R: std::io::Read + std::io::Seek>(__deku_reader: &mut deku::reader::Reader<'_, R>, endian: deku::ctx::Endian) -> core::result::Result<Self, deku::error::DekuError> -pub fn backhand::compression::Xz::to_writer<W: std::io::Write>(&self, __deku_writer: &mut deku::writer::Writer<W>, endian: deku::ctx::Endian) -> core::result::Result<(), deku::error::DekuError> +pub fn backhand::compression::Xz::to_writer<W: std::io::Write + std::io::Seek>(&self, __deku_writer: &mut deku::writer::Writer<W>, endian: deku::ctx::Endian) -> core::result::Result<(), deku::error::DekuError> -pub fn backhand::compression::Zstd::from_reader_with_ctx<R: std::io::Read>(__deku_reader: &mut deku::reader::Reader<'_, R>, endian: deku::ctx::Endian) -> core::result::Result<Self, deku::error::DekuError> +pub fn backhand::compression::Zstd::from_reader_with_ctx<R: std::io::Read + std::io::Seek>(__deku_reader: &mut deku::reader::Reader<'_, R>, endian: deku::ctx::Endian) -> core::result::Result<Self, deku::error::DekuError> -pub fn backhand::compression::Zstd::to_writer<W: std::io::Write>(&self, __deku_writer: &mut deku::writer::Writer<W>, endian: deku::ctx::Endian) -> core::result::Result<(), deku::error::DekuError> +pub fn backhand::compression::Zstd::to_writer<W: std::io::Write + std::io::Seek>(&self, __deku_writer: &mut deku::writer::Writer<W>, endian: deku::ctx::Endian) -> core::result::Result<(), deku::error::DekuError> -pub fn backhand::BasicFile::from_reader_with_ctx<R: std::io::Read>(__deku_reader: &mut deku::reader::Reader<'_, R>, (endian, block_size, block_log): (deku::ctx::Endian, u32, u16)) -> core::result::Result<Self, deku::error::DekuError> +pub fn backhand::BasicFile::from_reader_with_ctx<R: std::io::Read + std::io::Seek>(__deku_reader: &mut deku::reader::Reader<'_, R>, (endian, block_size, block_log): (deku::ctx::Endian, u32, u16)) -> core::result::Result<Self, deku::error::DekuError> -pub fn backhand::BasicFile::to_writer<W: std::io::Write>(&self, __deku_writer: &mut deku::writer::Writer<W>, (endian, block_size, block_log): (deku::ctx::Endian, u32, u16)) -> core::result::Result<(), deku::error::DekuError> +pub fn backhand::BasicFile::to_writer<W: std::io::Write + std::io::Seek>(&self, __deku_writer: &mut deku::writer::Writer<W>, (endian, block_size, block_log): (deku::ctx::Endian, u32, u16)) -> core::result::Result<(), deku::error::DekuError> -pub fn backhand::DataSize::from_reader_with_ctx<R: std::io::Read>(__deku_reader: &mut deku::reader::Reader<'_, R>, endian: deku::ctx::Endian) -> core::result::Result<Self, deku::error::DekuError> +pub fn backhand::DataSize::from_reader_with_ctx<R: std::io::Read + std::io::Seek>(__deku_reader: &mut deku::reader::Reader<'_, R>, endian: deku::ctx::Endian) -> core::result::Result<Self, deku::error::DekuError> -pub fn backhand::DataSize::to_writer<W: std::io::Write>(&self, __deku_writer: &mut deku::writer::Writer<W>, endian: deku::ctx::Endian) -> core::result::Result<(), deku::error::DekuError> +pub fn backhand::DataSize::to_writer<W: std::io::Write + std::io::Seek>(&self, __deku_writer: &mut deku::writer::Writer<W>, endian: deku::ctx::Endian) -> core::result::Result<(), deku::error::DekuError> -pub fn backhand::Export::from_reader_with_ctx<R: std::io::Read>(__deku_reader: &mut deku::reader::Reader<'_, R>, type_endian: deku::ctx::Endian) -> core::result::Result<Self, deku::error::DekuError> +pub fn backhand::Export::from_reader_with_ctx<R: std::io::Read + std::io::Seek>(__deku_reader: &mut deku::reader::Reader<'_, R>, type_endian: deku::ctx::Endian) -> core::result::Result<Self, deku::error::DekuError> -pub fn backhand::Export::to_writer<W: std::io::Write>(&self, __deku_writer: &mut deku::writer::Writer<W>, type_endian: deku::ctx::Endian) -> core::result::Result<(), deku::error::DekuError> +pub fn backhand::Export::to_writer<W: std::io::Write + std::io::Seek>(&self, __deku_writer: &mut deku::writer::Writer<W>, type_endian: deku::ctx::Endian) -> core::result::Result<(), deku::error::DekuError> -pub fn backhand::Fragment::from_reader_with_ctx<R: std::io::Read>(__deku_reader: &mut deku::reader::Reader<'_, R>, type_endian: deku::ctx::Endian) -> core::result::Result<Self, deku::error::DekuError> +pub fn backhand::Fragment::from_reader_with_ctx<R: std::io::Read + std::io::Seek>(__deku_reader: &mut deku::reader::Reader<'_, R>, type_endian: deku::ctx::Endian) -> core::result::Result<Self, deku::error::DekuError> -pub fn backhand::Fragment::to_writer<W: std::io::Write>(&self, __deku_writer: &mut deku::writer::Writer<W>, type_endian: deku::ctx::Endian) -> core::result::Result<(), deku::error::DekuError> +pub fn backhand::Fragment::to_writer<W: std::io::Write + std::io::Seek>(&self, __deku_writer: &mut deku::writer::Writer<W>, type_endian: deku::ctx::Endian) -> core::result::Result<(), deku::error::DekuError> -pub fn backhand::Id::from_reader_with_ctx<R: std::io::Read>(__deku_reader: &mut deku::reader::Reader<'_, R>, type_endian: deku::ctx::Endian) -> core::result::Result<Self, deku::error::DekuError> +pub fn backhand::Id::from_reader_with_ctx<R: std::io::Read + std::io::Seek>(__deku_reader: &mut deku::reader::Reader<'_, R>, type_endian: deku::ctx::Endian) -> core::result::Result<Self, deku::error::DekuError> -pub fn backhand::Id::to_writer<W: std::io::Write>(&self, __deku_writer: &mut deku::writer::Writer<W>, type_endian: deku::ctx::Endian) -> core::result::Result<(), deku::error::DekuError> +pub fn backhand::Id::to_writer<W: std::io::Write + std::io::Seek>(&self, __deku_writer: &mut deku::writer::Writer<W>, type_endian: deku::ctx::Endian) -> core::result::Result<(), deku::error::DekuError> -pub fn backhand::Inode::from_reader_with_ctx<R: std::io::Read>(__deku_reader: &mut deku::reader::Reader<'_, R>, (bytes_used, block_size, block_log, type_endian): (u64, u32, u16, deku::ctx::Endian)) -> core::result::Result<Self, deku::error::DekuError> +pub fn backhand::Inode::from_reader_with_ctx<R: std::io::Read + std::io::Seek>(__deku_reader: &mut deku::reader::Reader<'_, R>, (bytes_used, block_size, block_log, type_endian): (u64, u32, u16, deku::ctx::Endian)) -> core::result::Result<Self, deku::error::DekuError> -pub fn backhand::Inode::to_writer<W: std::io::Write>(&self, __deku_writer: &mut deku::writer::Writer<W>, (bytes_used, block_size, block_log, type_endian): (u64, u32, u16, deku::ctx::Endian)) -> core::result::Result<(), deku::error::DekuError> +pub fn backhand::Inode::to_writer<W: std::io::Write + std::io::Seek>(&self, __deku_writer: &mut deku::writer::Writer<W>, (bytes_used, block_size, block_log, type_endian): (u64, u32, u16, deku::ctx::Endian)) -> core::result::Result<(), deku::error::DekuError> -pub backhand::Squashfs::dir_blocks: (rustc_hash::FxHashMap<u64, u64>, alloc::vec::Vec<u8>) +pub backhand::Squashfs::dir_blocks: (solana_nohash_hasher::IntMap<u64, u64>, alloc::vec::Vec<u8>) -pub backhand::Squashfs::inodes: rustc_hash::FxHashMap<u32, backhand::Inode> +pub backhand::Squashfs::inodes: solana_nohash_hasher::IntMap<u32, backhand::Inode> -pub fn backhand::SuperBlock::from_reader_with_ctx<R: std::io::Read>(__deku_reader: &mut deku::reader::Reader<'_, R>, (ctx_magic, ctx_version_major, ctx_version_minor, ctx_type_endian): ([u8; 4], u16, u16, deku::ctx::Endian)) -> core::result::Result<Self, deku::error::DekuError> +pub fn backhand::SuperBlock::from_reader_with_ctx<R: std::io::Read + std::io::Seek>(__deku_reader: &mut deku::reader::Reader<'_, R>, (ctx_magic, ctx_version_major, ctx_version_minor, ctx_type_endian): ([u8; 4], u16, u16, deku::ctx::Endian)) -> core::result::Result<Self, deku::error::DekuError> -pub fn backhand::SuperBlock::to_writer<W: std::io::Write>(&self, __deku_writer: &mut deku::writer::Writer<W>, (ctx_magic, ctx_version_major, ctx_version_minor, ctx_type_endian): ([u8; 4], u16, u16, deku::ctx::Endian)) -> core::result::Result<(), deku::error::DekuError> +pub fn backhand::SuperBlock::to_writer<W: std::io::Write + std::io::Seek>(&self, __deku_writer: &mut deku::writer::Writer<W>, (ctx_magic, ctx_version_major, ctx_version_minor, ctx_type_endian): ([u8; 4], u16, u16, deku::ctx::Endian)) -> core::result::Result<(), deku::error::DekuError> Added items to the public API ============================= +pub fn backhand::compression::DefaultCompressor::compression_options(&self, superblock: &mut backhand::SuperBlock, kind: &backhand::kind::Kind, fs_compressor: backhand::FilesystemCompressor) -> core::result::Result<alloc::vec::Vec<u8>, backhand::BackhandError> +pub fn backhand::compression::DefaultCompressor::compression_options(&self, superblock: &mut backhand::SuperBlock, kind: &backhand::kind::Kind, fs_compressor: backhand::FilesystemCompressor) -> core::result::Result<alloc::vec::Vec<u8>, backhand::BackhandError> +pub fn backhand::compression::CompressionAction::compression_options(&self, superblock: &mut backhand::SuperBlock, kind: &backhand::kind::Kind, fs_compressor: backhand::FilesystemCompressor) -> core::result::Result<alloc::vec::Vec<u8>, backhand::BackhandError> +pub enum backhand::Flags +pub backhand::Flags::CompressorOptionsArePresent = 1024 +pub backhand::Flags::DataBlockStoredUncompressed = 2 +pub backhand::Flags::DataHasBeenDeduplicated = 64 +pub backhand::Flags::FragmentsAreAlwaysGenerated = 32 +pub backhand::Flags::FragmentsAreNotUsed = 16 +pub backhand::Flags::FragmentsStoredUncompressed = 8 +pub backhand::Flags::InodesStoredUncompressed = 1 +pub backhand::Flags::NFSExportTableExists = 128 +pub backhand::Flags::NoXattrsInArchive = 512 +pub backhand::Flags::Unused = 4 +pub backhand::Flags::XattrsAreStoredUncompressed = 256 +impl core::clone::Clone for backhand::Flags +pub fn backhand::Flags::clone(&self) -> backhand::Flags +impl core::fmt::Debug for backhand::Flags +pub fn backhand::Flags::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result +impl core::marker::Copy for backhand::Flags +pub fn backhand::FilesystemWriter<'a, 'b, 'c>::set_emit_compression_options(&mut self, value: bool) +pub fn backhand::FilesystemWriter<'a, 'b, 'c>::set_no_duplicate_files(&mut self, value: bool) +pub fn backhand::SuperBlock::data_has_been_deduplicated(&self) -> bool
## wcampbell0x2a/librarium
### v0.3.1Published: 2024-11-09 22:53:26 UTC | Tag:
v0.3.1
- Fix Cargo.toml keywords
Full Changelog: https://github.com/wcampbell0x2a/librarium/compare/v0.3.0...v0.3.1
## wcampbell0x2a/test-assets-ureq
### v0.3.0Published: 2024-11-09 22:13:55 UTC | Tag:
v0.3.0
- Initial release of ureq fork
## wcampbell0x2a/librarium
### v0.3.0Published: 2024-11-09 18:06:15 UTC | Tag:
v0.3.0
- Add support for Reading and Writing both Odc and Newc CPIO archives
- Cleanup up all documentation, adding examples and checking readme
Full Changelog: https://github.com/wcampbell0x2a/librarium/compare/v0.2.0...v0.3.0
## wcampbell0x2a/kokiri
### v0.1.2Published: 2024-10-25 03:51:26 UTC | Tag:
v0.1.2Publish on crates.io
### v0.1.1Published: 2024-10-25 03:48:13 UTC | Tag:
v0.1.1
## wcampbell0x2a/aftermath
### v0.1.1Published: 2024-10-25 03:45:36 UTC | Tag:
v0.1.1Publish on crates.io
### v0.1.0Published: 2024-10-25 03:29:01 UTC | Tag:
v0.1.0Initial Release
## wcampbell0x2a/zerus
### v0.10.1Published: 2024-10-25 03:02:53 UTC | Tag:
v0.10.1
- Add
ltoto github release binaries
## wcampbell0x2a/income
### v0.2.0Published: 2024-10-22 03:23:23 UTC | Tag:
v0.2.0
- Initial working release
## wcampbell0x2a/zerus
### v0.10.0Published: 2024-10-22 02:37:40 UTC | Tag:
v0.10.0Updates
- Add instructions for use with integer32llc/Margo
- Add
--git-index-urlto configure mirrorconfig.json#95- Add check of status code when downloading #97
- Add better message for not finding
Cargo.toml#96Dependencies
- Bump clap from 4.5.9 to 4.5.20
- Bump git2 from 0.18.3 to 0.19.0
- Bump anyhow from 1.0.82 to 1.0.90
- Bump reqwest from 0.12.3 to 0.12.8
## wcampbell0x2a/no-std-io2
### v0.8.1Published: 2024-10-12 20:45:38 UTC | Tag:
v0.8.1
- Fix
Writeimpl foralloc::Vec
## wcampbell0x2a/zerus
### v0.9.0Published: 2024-10-12 20:34:14 UTC | Tag:
v0.9.0
- Add support for latest nightly
- Add --skip-git-index to not download git index crates.io
## wcampbell0x2a/librarium
### v0.2.0Published: 2024-09-27 03:31:09 UTC | Tag:
v0.2.0First official :tm: release
## sharksforarms/deku
### v0.18.0Published: 2024-09-07 15:23:28 UTC | Tag:
deku-v0.18.0Usability
- Reading now requires
Seek. Attributes such asseek_from_start,seek_from_current,seek_from_end, andseek_rewindwere added to be able to control the position of the reader before reading a field (#360)- Support added for unit structs (#450)
to_slicewas added to write an to a slice (#461)Performance
- The use of bits parsing is now an optional feature. If bit-level parsing is not useful for your application, you can disable it to get some performance benefits. (#446)
- Performance of
read_allwas improved (#441)Enum improvements
## wcampbell0x2a/zerus
### v0.8.1Published: 2024-05-30 21:29:18 UTC | Tag:
v0.8.1
- Force checkout when using Fast-Forward when updating git
crates.io-index
### v0.8.0Published: 2024-05-30 01:44:20 UTC | Tag:
v0.8.0
- Properly set local HEAD to fetched git repo crates.io-index when updating from previous zerus invocation
## sharksforarms/deku
### v0.17.0Published: 2024-05-24 03:29:46 UTC | Tag:
deku-v0.17.0Changes
- Bumped MSRV to
1.71(#438)- Add DekuWrite impl for
[T](#416)- Add
no-assert-stringfeature to remove panic string on failed assertion (#405)- Add
read_allattribute to read untilreader.end()(#387)- Changed edition to 2021 (#389)
- Refactored
loggingfeature with massive usability increases (#352), (#355)- Bumped the
synlibrary to 2.0, which required replacingtypefor Enums withid_type(#386)#[derive(PartialEq, Debug, DekuRead, DekuWrite)] -#[deku(type = "u8")] +#[deku(id_type = "u8")] enum DekuTest { #[deku(id_pat = "_")] VariantC((u8, u8)), }Updated Reader API
- Changed API of reading to use
io::Read, bringing massive performance and usability improvements (#352)- Changed the trait
DekuReadtoDekuReaderFor example:
use std::io::{Seek, SeekFrom, Read}; use std::fs::File; use deku::prelude::*; #[derive(Debug, DekuRead, DekuWrite, PartialEq, Eq, Clone, Hash)] #[deku(endian = "big")] struct EcHdr { magic: [u8; 4], version: u8, padding1: [u8; 3], } let mut file = File::options().read(true).open("file").unwrap(); let ec = EcHdr::from_reader((&mut file, 0)).unwrap();
- The more internal (with context)
read(..)was replaced withfrom_reader_with_ctx(..). With the switch to internal streaming, the variablesdeku::input,deku::input_bits, anddeku::restare now not possible and were removed.deku::readeris a replacement for some of the functionality. See examples/deku_input.rs for a new example of caching all reads.Old:
#[derive(Debug, PartialEq, DekuRead, DekuWrite)] struct DekuTest { field_a: u8, #[deku( reader = "bit_flipper_read(*field_a, deku::rest, BitSize(8))", )] field_b: u8, } fn custom_read( field_a: u8, rest: &BitSlice<u8, Msb0>, bit_size: BitSize, ) -> Result<(&BitSlice<u8, Msb0>, u8), DekuError> { // read field_b, calling original func let (rest, value) = u8::read(rest, bit_size)?; Ok((rest, value)) }New:
#[derive(Debug, PartialEq, DekuRead, DekuWrite)] struct DekuTest { field_a: u8, #[deku( reader = "bit_flipper_read(*field_a, deku::reader, BitSize(8))", )] field_b: u8, } fn custom_read<R: std::io::Read>( field_a: u8, reader: &mut Reader<R>, bit_size: BitSize, ) -> Result<u8, DekuError> { // read field_b, calling original func let value = u8::from_reader_with_ctx(reader, bit_size)?; Ok(value) }
- With the addition of using
Read, containing a byte slice with a reference is not supported:Old
#[derive(PartialEq, Debug, DekuRead, DekuWrite)] struct TestStruct<'a> { bytes: u8, #[deku(bytes_read = "bytes")] data: &'a [u8], }New
#[derive(PartialEq, Debug, DekuRead, DekuWrite)] struct TestStruct { bytes: u8, #[deku(bytes_read = "bytes")] data: Vec<u8>, }
id_patis now required to be the same type as stored id. This also disallows using tuples for storing the id:Old:
#[derive(PartialEq, Debug, DekuRead, DekuWrite)] #[deku(id_type = "u8")] enum DekuTest { #[deku(id_pat = "_")] VariantC((u8, u8)), }New:
#[derive(PartialEq, Debug, DekuRead, DekuWrite)] #[deku(id_type = "u8")] enum DekuTest { #[deku(id_pat = "_")] VariantC { id: u8, other: u8, }, }
- The feature
const_genericswas removed and is enabled by default.Updated Writer API
- Changed API of writing to use
io::Write, bringing massive performance and usability improvements (#355)- Changed the trait
DekuWritetoDekuWriter- The more internal (with context)
write(..)was replaced withto_writer(..). With the switch to internal streaming, the variablesdeku::outputare now not possible and were removed.deku::writeris a replacement for some of the functionality.Old:
fn bit_flipper_write( field_a: u8, field_b: u8, output: &mut BitVec<u8, Msb0>, bit_size: BitSize, ) -> Result<(), DekuError> { // Access to previously written fields println!("field_a = 0x{:X}", field_a); // value of field_b println!("field_b = 0x{:X}", field_b); // Size of the current field println!("bit_size: {:?}", bit_size); // flip the bits on value if field_a is 0x01 let value = if field_a == 0x01 { !field_b } else { field_b }; value.write(output, bit_size) } #[derive(Debug, PartialEq, DekuRead, DekuWrite)] struct DekuTest { field_a: u8, #[deku( writer = "bit_flipper_write(*field_a, *field_b, deku::output, BitSize(8))" )] field_b: u8, }New:
fn bit_flipper_write<W: Write>( field_a: u8, field_b: u8, writer: &mut Writer<W>, bit_size: BitSize, ) -> Result<(), DekuError> { // Access to previously written fields println!("field_a = 0x{:X}", field_a); // value of field_b println!("field_b = 0x{:X}", field_b); // Size of the current field println!("bit_size: {:?}", bit_size); // flip the bits on value if field_a is 0x01 let value = if field_a == 0x01 { !field_b } else { field_b }; value.to_writer(writer, bit_size) } #[derive(Debug, PartialEq, DekuRead, DekuWrite)] struct DekuTest { field_a: u8, #[deku( writer = "bit_flipper_write(*field_a, *field_b, deku::writer, BitSize(8))" )] field_b: u8, }
- Added
DekuError::Writeto denoteio::WriteerrorsBug fix
- Fix error for invalid deku_id generation on generic enum (#411)
## wcampbell0x2a/backhand
### v0.17.0Published: 2024-05-06 22:51:42 UTC | Tag:
v0.17.0
### v0.16.0Published: 2024-04-26 22:07:15 UTC | Tag:
v0.16.0[v0.16.0] - 2024-04-25
backhand
- Simplify API by removing
FilesystemReader::alloc_read_buffers(). This is now handled internally byFilesystemReader::reader()(#530)
backhand-cli
- Add
x86_64-apple-darwinsupport and release binary (#511)- Fix
--helpand correctly showgzipsupport when usinggzip-zune-inflate(#538)- Fix
--helpand correctly showxzsupport when usingxz-static(#541)Dependencies
- Bump
zstdfrom 0.13.0 to 0.13.1 (#518)- Bump
rayonfrom 1.9.0 to 1.10.0 (#512)- Bump
codecov/codecov-actionfrom 4.1.0 to 4.3.0 (#514, #526)- Bump
obi1kenobi/cargo-semver-checks-actionfrom 2.3 to 2.4 (#507)- Bump
clapfrom 4.5.2 to 4.5.4 (#513)- Bump
libdeflaterfrom 1.19.3 to 1.20.0 (#523)- Bump
dangoslen/dependabot-changelog-helperfrom 3.8.1 to 3.9.0 (#516)- Bump
thiserrorfrom 1.0.58 to 1.0.59 (#534)- Bump
color-printfrom 0.3.5 to 0.3.6 (#537)- Bump
clap_completefrom 4.5.1 to 4.5.2 (#525)Complete API Updates
Click to expand
Removed items from the public API ================================= -pub fn backhand::FilesystemReader<'b>::alloc_read_buffers(&self) -> (alloc::vec::Vec<u8>, alloc::vec::Vec<u8>) Changed items in the public API =============================== -pub fn backhand::FilesystemReaderFile<'a, 'b>::reader(&self, buf_read: &'a mut alloc::vec::Vec<u8>, buf_decompress: &'a mut alloc::vec::Vec<u8>) -> backhand::SquashfsReadFile<'a, 'b> +pub fn backhand::FilesystemReaderFile<'a, 'b>::reader(&self) -> backhand::SquashfsReadFile<'a, 'b> Added items to the public API ============================= (none)Full Diff: https://github.com/wcampbell0x2a/backhand/compare/v0.15.0...v0.16.0
## wcampbell0x2a/zerus
### v0.7.0Published: 2024-04-11 23:23:49 UTC | Tag:
v0.7.0
- Add automatic crates.io git clone and fetch for mirror
## wcampbell0x2a/backhand
### v0.15.0Published: 2024-03-24 19:23:46 UTC | Tag:
v0.15.0[v0.15.0] - 2024-03-24
backhand
- Add support for
SocketandNamedFIFOInodes in library and extraction binaries. Thanks (@tnias) (#472, #470)
- Add
FilesytemWriter::push_fifoandFilesystemWriter::push_socket- Fix panic found with fuzz testing in
NodeHeader::from_inode(#494)- Add tests for zstd compression support. Fix bug with zstd writer and added
zstd-safedependency (#504)- Added
inlines to small public functions (#504)- Changed
FilesystemReader.cachetoRwLockto reduce blocking time during fragment reading (#504)- Increase performance of reading uncompressed fragments (small files) heavy images by removing unnecessary clones of data (#504). Found by (@bryangarza) in (!503).
- Increased performance of reading inodes (#453)
- Reduce allocations within
Squashfs.dir_blocks(#447)- Add pre-allocate before reading
inodes(#437)- Prevent several bounds check failures found by fuzz testing (#499)
backhand-cli
- Bump MSRV to
1.74forclap-4.5.1update (#483)
backhand-test
- Reduced maximum allocation during testing by free'ing right after full usage (#504)
unsquashfs
- Performance: Remove progress bar Mutex lock when
--quiet(#430)Dependencies
- Bump
actions/upload-artifactfrom 4.1.0 to 4.3.1 (#435, #446, #465)- Bump
env_loggerfrom 0.10.1 to 0.10.2 (#432)- Bump
rayonfrom 1.8.0 to 1.9.0 (#431, #496)- Bump
clapfrom 4.4.17 to 4.5.2 (#428, #500)- Bump
clap_completefrom 4.4.7 to 4.5.1 (#444, #445, #482)- Bump
codecov/codecov-actionfrom 3.1.4 to 4.1.0 (#448, #457, #458, #462, #488, #493)- Bump
obi1kenobi/cargo-semver-checks-actionfrom 2.2 to 2.3 (#449)- Bump
libcfrom 0.2.152 to 0.2.153 (#459)- Bump
dangoslen/dependabot-changelog-helperfrom 3.7.0 to 3.8.0 (#461)- Bump
thiserrorfrom 1.0.56 to 1.0.58 (#476, #502)- Bump
indicatiffrom 0.17.7 to 0.17.8 (#477)- Bump
libdeflaterfrom 1.19.0 to 1.19.3 (#486, #498)- Bump
assert_cmdfrom 2.0.13 to 2.0.14 (#484)- Bump
nixfrom 0.27.1 to 0.28.0 (#489)- Bump
test-logfrom 0.2.14 to 0.2.15 (#492)- Bump
tempfilefrom 3.9.0 to 3.10.1 (#491)- Bump
actions/checkoutfrom 4.1.1 to 4.1.2 (#501)
## wcampbell0x2a/zerus
### v0.6.0Published: 2024-02-26 01:27:21 UTC | Tag:
v0.6.0
- Download crates in parallel
## wcampbell0x2a/asterix-rs
### v0.4.0Published: 2024-02-09 22:33:22 UTC | Tag:
v0.4.0
- Add support for the following 48/030 packets:
WrongDFReplyFormatDetectedTransponderAnomalyMsTransponderAnomalySIPotentialICConflictICConflictDetectionPossibleAMGAllocated(u16)Manufacture(u16)
## wcampbell0x2a/zerus
### v0.5.0Published: 2024-02-03 22:47:02 UTC | Tag:
v0.5.0
- Support vendoring rustc build-std dependencies for specific nightly versions with
zerus --build-std- Improve performance
- Update README.md
## wcampbell0x2a/dbg_hex
### v0.2.0Published: 2024-01-20 18:46:23 UTC | Tag:
v0.2.0
- Add column number to dbg output (https://github.com/wcampbell0x2a/dbg_hex/pull/4)
## wcampbell0x2a/backhand
### v0.14.2Published: 2024-01-17 05:43:14 UTC | Tag:
v0.14.2
backhand
- Enable overflow-checks (#421)
- Add feature
gzip-zune-inflateto add a decompress only option with speed improvements (#419)- Remove allocation for
impl From<BackhandError> for io::Error {(#425)
backhand-cli
- Enable overflow-checks for dist builds (#421)
unsquashfs
- Use feature
gzip-zune-inflatefor dist build and speed improvements (#419)- Updated benchmarks to show improvement (#419)
Dependencies
- Bump
clapfrom 4.4.12 to 4.4.17 (#417, #424)- Bump
thiserrorfrom 1.0.53 to 1.0.56 (#404)- Bump
actions/upload-artifactfrom 4.0.0 to 4.1.0 (#423)- Bump
libcfrom 0.2.151 to 0.2.152 (#408)- Bump
clap_completefrom 4.4.5 to 4.4.7 (#426)- Bump
assert_cmdfrom 2.0.12 to 2.0.13 (#422)- Bump
consolefrom 0.15.7 to 0.15.8 (#413)
### v0.14.1Published: 2024-01-14 15:57:39 UTC | Tag:
v0.14.1
backhandChanges
- Fix path to project
README.mdforcrates.io
### v0.14.0Published: 2024-01-13 20:03:28 UTC | Tag:
v0.14.0Major changes were made to the organization of this repo, with the library
backhandnow being separated from thebackhand-clipackage, which is used to installunsquashfs,replace, andadd.
backhandChanges
- Following changes were done to allow multi-threaded applications (#278)
- Change
RefCell<Box<T>>intoArc<Mutex<T>>- Change
RefCell<T>intoMutex<T>- Change
Rc<T>intoArc<T>- Change
dyn CompressionActiontodyn CompressionAction + Send + SyncforKinduses- Change
BufReadSeek: BufRead + Seek {}toBufReadSeek: BufRead + Seek + Send {}- Allow user provided read/write files to not be static (@rbran) (#285)
- Bump MSRV to
1.67.1- Allow creating and reading uncompressed files (@rbran) (#365)
- Allow calling
FilesystemWriter::writewith Owned and RefMut writer (@rbran) (#361)- Push dir, file, etc, with lifetimes unrelated to reader from
from_fs_reader(@rbran) (#361) For example, the following is now allowed:- let mut output = File::create(&args.out).unwrap(); - if let Err(e) = filesystem.write(&mut output) { + let output = File::create(&args.out).unwrap(); + if let Err(e) = filesystem.write(output) {Bug Fix
- When creating an empty image using
FilesystemWriter::default(), correctly create the ID table for UID and GID entries. Reported: (@hwittenborn) (!250), Fixed: (#275)- Remove manual
Cloneimpl forFilesystemReaderFile(#277)- Increase
DirectoryIndex::name_sizelength from 100 to 255. (@eatradish) (!282), Fixed: (#283)- Prevent
push_file"file within file", will now returnInvalidFilePath(@rbran) (#364)- Fix
gidanduidforpush_dir_all(..)(#360)Security
backhand-cliChanges to All
stripandLTOare enabled for release binaries- Fix macOS builds (#260)
- Bump MSRV to
1.73.0to use now stabilizedstd::os::unix::fs::lchown- Add color styling to help output (#387)
unsquashfs
- Changed name to
unsquashfs-backhand(#356)- Add progress bar for a cleaner output when extracting files (#272)
- Add
--quietfor not displaying progress bar and RUST_LOG output (#272)- Add multiple threads for extracing files, giving us the same performance in most cases as
squashfs-tools/unsquashfs! (#278)add
- Changed name to
add-backhand(#356)replace
- Changed name to
replace-backhand(#356)ci
- Add testing and release binaries for the following platforms:(#259)
aarch64-unknown-linux-muslarm-unknown-linux-musleabix86_64-unknown-linux-musl(previously already release supported)- Testing and release binaries were not added for macOS, support was tested on that platform.
testing
- Replace curl in test dependency
test-assetswith ureq (#264)- Replace
zune-inflatewithlibdeflaterfor custom decompression testing for reliability (#325)Dependencies
- Bump
flate2from 1.0.26 to 1.0.28 (#307)- Bump
jemallocatorfrom 0.5.0 to 0.5.4 (#305)- Bump
env_loggerfrom 0.10.0 to 0.10.1 (#341)- Bump
clapfrom 4.4.7 to 4.4.12 (#340, #371, #376, #399)- Bump
dangoslen/dependabot-changelog-helperfrom 3.5.0 to 3.7.0 (#342, #369)- Bump
tracing-subscriberfrom 0.3.17 to 0.3.18 (#347)- Bump
byte-unitfrom 4.0.19 to 5.0.3 (#367)- Bump
actions/labelerfrom 4 to 5 (#377)- Bump
test-logfrom 0.2.13 to 0.2.14 (#378)- Bump
clap_completefrom 4.4.4 to 4.4.5 (#393)- Bump
thiserrorfrom 1.0.51 to 1.0.53 (#391, #401)- Bump
actions/upload-artifactfrom 3.1.3 to 4.0.0 (#380)- Bump
tempfilefrom 3.8.1 to 3.9.0 (#398)- Bump
document-featuresfrom 0.2.7 to 0.2.8 (#400)
## wcampbell0x2a/asterix-rs
### v0.3.1Published: 2023-10-14 15:29:50 UTC | Tag:
v0.3.1
- Update deku to 0.16
- Update syn to 2.0
- Improve use of syn NestedMeta for loading fspec
## wcampbell0x2a/assert_hex
### v0.4.1Published: 2023-09-17 14:50:42 UTC | Tag:
v0.4.1
- Fix regression with panics with extra messages such as:
assert_eq_hex!(0xff, 0x00, "yikes"). (@hortont424) (https://github.com/wcampbell0x2a/assert_hex/pull/9)
## wcampbell0x2a/statusbar
### v0.3.5Published: 2023-09-11 02:10:54 UTC | Tag:
v0.3.5
- Update cpu and mem to always show 2 chars
## wcampbell0x2a/assert_hex
### v0.4.0Published: 2023-09-11 02:06:26 UTC | Tag:
v0.4.0
- Further update panic string format to match rust std
## wcampbell0x2a/backhand
### v0.13.0Published: 2023-06-19 02:49:41 UTC | Tag:
v0.13.0backhand
Changes
- Decrease in memory usage for file reader and write (#255)
- Remove unnecessary deconstruction/reconstruction of Vec when reading inodes (@rbran) (#251)
- Only store file data compressed if it results in smaller size (@rbran) (#250)
- Remove
lzobeing a default feature because of GPL license (#240)- Add support for OpenWRT compression options (#239)
- Bump MSRV to
1.65.0for latestclaprequirements (#253)Bug Fix
- Fix bug in generating Uid and Gid's with
FilesystemWriter. All internal representation of Gid and Uid are changed to u32 (#254)- Remove case where invalid filesystem root_inode_offset would cause invalid bounds read panic. Found by fuzzer (#245)
Complete API Updates
$ cargo public-api -ss diff v0.12.0..HEADClick to expand
Removed items from the public API ================================= (none) Changed items in the public API =============================== -pub fn backhand::FilesystemWriter<'a>::set_root_gid(&mut self, gid: u16) +pub fn backhand::FilesystemWriter<'a>::set_root_gid(&mut self, gid: u32) -pub fn backhand::FilesystemWriter<'a>::set_root_uid(&mut self, uid: u16) +pub fn backhand::FilesystemWriter<'a>::set_root_uid(&mut self, uid: u32) -pub backhand::NodeHeader::gid: u16 +pub backhand::NodeHeader::gid: u32 -pub backhand::NodeHeader::uid: u16 +pub backhand::NodeHeader::uid: u32 -pub fn backhand::NodeHeader::new(permissions: u16, uid: u16, gid: u16, mtime: u32) -> Self +pub fn backhand::NodeHeader::new(permissions: u16, uid: u32, gid: u32, mtime: u32) -> Self Added items to the public API ============================= +pub backhand::compression::Xz::bit_opts: core::option::Option<u16> +pub backhand::compression::Xz::fb: core::option::Option<u16> +pub fn backhand::kind::Kind::magic(&self) -> [u8; 4] +impl backhand::NodeHeader +pub fn backhand::NodeHeader::from_inode(inode_header: InodeHeader, id_table: &[backhand::Id]) -> SelfAll binaries
Changes
- jemalloc is now used for
-muslrelease targets for performance reasons (#254)HAVE_DECODER_ARM,HAVE_DECODER_ARM64, andHAVE_DECODER_ARMTHUMBfilter flags are now defined for xz2. This only effects static build created in our CI. (#254)- Add
RUST_LOGand available Decompressors to--helpof all binaries (#242)add
Changes
- Add
--dirto create a empty directory (#242)Bug Fix
- Add correctly reading new file metadata from
--file, force other arguments for--dir(#254)unsquashfs
Changes
### v0.12.0Published: 2023-05-07 21:02:24 UTC | Tag:
v0.12.0Thanks @rbran for the contributions!
backhand
Kindhas been extended to take anCompressionActionto have a custom compression and decompression algorithm. This defaults to theDefaultCompressorin most situations to be like the Linux kernel squashfs code. This should allow an ever greater array of custom vendor Squashfs image support. Many API changes were done to support this, Most of the following changes focus on the Public API that we expect the normal developer to be using.- Added method to allow creating image without padding:
FilesystemWriter::set_no_padding()- Added method to allow modification to Compression options:
FilesystemCompressor::options(&mut self, options: CompressionOptions)- Added
FilesytemWriter::push_dir_all, following behavior ofstd::fs::create_dir_alland create required parent directories- Added
FilesystemReader::files()andfile()as the new method of reading files from an image. This change also reduced allocations in use when reading.- for node in &filesystem.nodes { + for node in filesystem.files() {
- Compression Options are now written to the image during
FilesystemWriter.write(..)- Removed non-used allocation in
SquashFsReader. No change in public API.- Changed
SquashfsReadFile::reader(..)to reduce the amount of allocation when extracting a file. This required addingalloc_read_buffersto initialize the re-used buffers.+// alloc required space for file data readers +let (mut buf_read, mut buf_decompress) = filesystem.alloc_read_buffers(); -let mut reader = filesystem.file(&file.basic).reader(); +let mut reader = filesystem + .file(&file.basic) + .reader(&mut buf_read, &mut buf_decompress);
- Removed
FilesystemReader::read_file- Changed
FilesytemWriter::push_file<P: Into<PathBuf>>(intopush_file<P: AsRef<Path>>(. NOTE: The function will no longer create parent directories! Instead use newFilesytemWriter::push_dir_all- Removed
SquashfsFileSource- Changed
FilesystemWriter::push_*()functions to now returnBackhandErrorto avoid duplicate files and invalid file paths. The followingBackhandErrors were added to support this:DuplicatedFileName,UndefineFileName, andInvalidFilePath.- Changed
FilesystemWriter::push_block_device<P: Into<PathBuf>>()intoP: AsRef<Path>- Changed
FilesystemWriter::push_block_device<P: Into<PathBuf>>()intoP: AsRef<Path>- Changed
FilesystemWriter::write_with_offset()to now take&mut self- Changed
FilesystemWriter::write()to now take&mut self- Removed trait bound from
FilesystemReader,FilesystemReaderFile, andFilesystemWriter:-pub struct backhand::FilesystemReader<R: backhand::ReadSeek> +pub struct backhand::FilesystemReader -pub struct backhand::FilesystemReaderFile<'a, R: backhand::ReadSeek> +pub struct backhand::FilesystemReaderFile<'a> -pub struct backhand::FilesystemWriter<'a, R: backhand::ReadSeek> +pub struct backhand::FilesystemWriter<'a>
- Changed public fields in
FilesystemReader:-pub root_inode: SquashfsDir, -pub nodes: Vec<Node<SquashfsFileReader>>, +pub root: Nodes<SquashfsFileReader>,
FilesystemReader::from_reader_*()functions now takeBufReadSeekfor an increase in performance during reading for some images.Detailed Changed/Added/Removed
$ cargo public-api -ss diff v0.11.0..HEADClick to expand
Removed items from the public API ================================= -pub fn backhand::kind::Kind::new() -> Self -impl core::default::Default for backhand::kind::Kind -pub fn backhand::kind::Kind::default() -> Self -impl deku::DekuRead<'_, backhand::kind::Kind> for backhand::Export -impl deku::DekuRead<'_, backhand::kind::Kind> for backhand::Export -pub fn backhand::kind::Kind::read(__deku_input_bits: &bitvec::slice::BitSlice<u8, bitvec::order::Msb0>, kind: backhand::kind::Kind) -> core::result::Result<(&bitvec::slice::BitSlice<u8, bitvec::order::Msb0>, Self), deku::error::DekuError> -pub fn backhand::kind::Kind::read(__deku_input_bits: &bitvec::slice::BitSlice<u8, bitvec::order::Msb0>, kind: backhand::kind::Kind) -> core::result::Result<(&bitvec::slice::BitSlice<u8, bitvec::order::Msb0>, Self), deku::error::DekuError> -pub fn backhand::kind::Kind::read(__deku_input_bits: &bitvec::slice::BitSlice<u8, bitvec::order::Msb0>, kind: backhand::kind::Kind) -> core::result::Result<(&bitvec::slice::BitSlice<u8, bitvec::order::Msb0>, Self), deku::error::DekuError> -pub fn backhand::kind::Kind::read(__deku_input_bits: &bitvec::slice::BitSlice<u8, bitvec::order::Msb0>, kind: backhand::kind::Kind) -> core::result::Result<(&bitvec::slice::BitSlice<u8, bitvec::order::Msb0>, Self), deku::error::DekuError> -impl deku::DekuRead<'_, backhand::kind::Kind> for backhand::Fragment -impl deku::DekuRead<'_, backhand::kind::Kind> for backhand::Fragment -impl deku::DekuRead<'_, backhand::kind::Kind> for backhand::Id -impl deku::DekuRead<'_, backhand::kind::Kind> for backhand::Id -impl deku::DekuRead<'_, backhand::kind::Kind> for backhand::SuperBlock -impl deku::DekuRead<'_, backhand::kind::Kind> for backhand::SuperBlock -impl deku::DekuWrite<backhand::kind::Kind> for backhand::Export -impl deku::DekuWrite<backhand::kind::Kind> for backhand::Export -pub fn backhand::kind::Kind::write(&self, __deku_output: &mut bitvec::vec::BitVec<u8, bitvec::order::Msb0>, kind: backhand::kind::Kind) -> core::result::Result<(), deku::error::DekuError> -pub fn backhand::kind::Kind::write(&self, __deku_output: &mut bitvec::vec::BitVec<u8, bitvec::order::Msb0>, kind: backhand::kind::Kind) -> core::result::Result<(), deku::error::DekuError> -pub fn backhand::kind::Kind::write(&self, __deku_output: &mut bitvec::vec::BitVec<u8, bitvec::order::Msb0>, kind: backhand::kind::Kind) -> core::result::Result<(), deku::error::DekuError> -pub fn backhand::kind::Kind::write(&self, __deku_output: &mut bitvec::vec::BitVec<u8, bitvec::order::Msb0>, kind: backhand::kind::Kind) -> core::result::Result<(), deku::error::DekuError> -impl deku::DekuWrite<backhand::kind::Kind> for backhand::Fragment -impl deku::DekuWrite<backhand::kind::Kind> for backhand::Fragment -impl deku::DekuWrite<backhand::kind::Kind> for backhand::Id -impl deku::DekuWrite<backhand::kind::Kind> for backhand::Id -impl deku::DekuWrite<backhand::kind::Kind> for backhand::SuperBlock -impl deku::DekuWrite<backhand::kind::Kind> for backhand::SuperBlock -impl core::clone::Clone for backhand::kind::Kind -pub fn backhand::kind::Kind::clone(&self) -> backhand::kind::Kind -impl core::cmp::Eq for backhand::kind::Kind -impl core::cmp::PartialEq<backhand::kind::Kind> for backhand::kind::Kind -pub fn backhand::kind::Kind::eq(&self, other: &backhand::kind::Kind) -> bool -impl core::marker::Copy for backhand::kind::Kind -impl core::marker::StructuralEq for backhand::kind::Kind -impl core::marker::StructuralPartialEq for backhand::kind::Kind -pub enum backhand::SquashfsFileSource<'a, R: backhand::ReadSeek> -pub backhand::SquashfsFileSource::SquashfsFile(backhand::FilesystemReaderFile<'a, R>) -pub backhand::SquashfsFileSource::UserDefined(core::cell::RefCell<alloc::boxed::Box<(dyn std::io::Read + 'a)>>) -pub fn backhand::Export::read(__deku_input_bits: &bitvec::slice::BitSlice<u8, bitvec::order::Msb0>, kind: backhand::kind::Kind) -> core::result::Result<(&bitvec::slice::BitSlice<u8, bitvec::order::Msb0>, Self), deku::error::DekuError> -pub fn backhand::Export::write(&self, __deku_output: &mut bitvec::vec::BitVec<u8, bitvec::order::Msb0>, kind: backhand::kind::Kind) -> core::result::Result<(), deku::error::DekuError> -pub backhand::FilesystemReader::nodes: alloc::vec::Vec<backhand::Node<backhand::SquashfsFileReader>> -pub backhand::FilesystemReader::root_inode: backhand::SquashfsDir -impl<R: backhand::ReadSeek> backhand::FilesystemReader<R> -impl<R: backhand::ReadSeek> backhand::FilesystemReader<R> -pub fn backhand::FilesystemReader::file<'a>(&'a self, basic_file: &'a backhand::BasicFile) -> backhand::FilesystemReaderFile<'a, R> -pub fn backhand::FilesystemReader::read_file(&self, basic_file: &backhand::BasicFile) -> core::result::Result<alloc::vec::Vec<u8>, backhand::BackhandError> -pub fn backhand::FilesystemReader::from_reader(reader: R) -> core::result::Result<Self, backhand::BackhandError> -impl<R: backhand::ReadSeek> backhand::FilesystemReader<SquashfsReaderWithOffset<R>> -pub fn backhand::FilesystemReader::from_reader_with_offset(reader: R, offset: u64) -> core::result::Result<Self, backhand::BackhandError> -pub fn backhand::FilesystemReader::from_reader_with_offset_and_kind(reader: R, offset: u64, kind: backhand::kind::Kind) -> core::result::Result<Self, backhand::BackhandError> -impl<R: core::fmt::Debug + backhand::ReadSeek> core::fmt::Debug for backhand::FilesystemReader<R> -pub fn backhand::FilesystemReader::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result -impl<'a, R: backhand::ReadSeek> backhand::FilesystemReaderFile<'a, R> -pub fn backhand::FilesystemReaderFile::new(system: &'a backhand::FilesystemReader<R>, basic: &'a backhand::BasicFile) -> Self -pub fn backhand::FilesystemReaderFile::reader(&self) -> SquashfsReadFile<'a, R> -impl<'a, R: backhand::ReadSeek> core::clone::Clone for backhand::FilesystemReaderFile<'a, R> -impl<'a, R: backhand::ReadSeek> core::iter::traits::collect::IntoIterator for backhand::FilesystemReaderFile<'a, R> -impl<'a, R: core::marker::Copy + backhand::ReadSeek> core::marker::Copy for backhand::FilesystemReaderFile<'a, R> -impl<'a, R: backhand::ReadSeek> backhand::FilesystemWriter<'a, R> -pub fn backhand::FilesystemWriter::from_fs_reader(reader: &'a backhand::FilesystemReader<R>) -> core::result::Result<Self, backhand::BackhandError> -pub fn backhand::FilesystemWriter::mut_file<S: core::convert::Into<std::path::PathBuf>>(&mut self, find_path: S) -> core::option::Option<&mut backhand::SquashfsFileWriter<'a, R>> -pub fn backhand::FilesystemWriter::push_block_device<P: core::convert::Into<std::path::PathBuf>>(&mut self, device_number: u32, path: P, header: backhand::NodeHeader) -pub fn backhand::FilesystemWriter::push_char_device<P: core::convert::Into<std::path::PathBuf>>(&mut self, device_number: u32, path: P, header: backhand::NodeHeader) -pub fn backhand::FilesystemWriter::push_dir<P: core::convert::Into<std::path::PathBuf>>(&mut self, path: P, header: backhand::NodeHeader) -pub fn backhand::FilesystemWriter::push_file<P: core::convert::Into<std::path::PathBuf>>(&mut self, reader: impl std::io::Read + 'a, path: P, header: backhand::NodeHeader) -pub fn backhand::FilesystemWriter::push_symlink<P: core::convert::Into<std::path::PathBuf>, S: core::convert::Into<std::path::PathBuf>>(&mut self, link: S, path: P, header: backhand::NodeHeader) -pub fn backhand::FilesystemWriter::replace_file<S: core::convert::Into<std::path::PathBuf>>(&mut self, find_path: S, reader: impl std::io::Read + 'a) -> core::result::Result<(), backhand::BackhandError> -pub fn backhand::FilesystemWriter::write<W: std::io::Write + std::io::Seek>(&self, w: &mut W) -> core::result::Result<(backhand::SuperBlock, u64), backhand::BackhandError> -pub fn backhand::FilesystemWriter::write_with_offset<W: std::io::Write + std::io::Seek>(&self, w: &mut W, offset: u64) -> core::result::Result<(backhand::SuperBlock, u64), backhand::BackhandError> -impl core::default::Default for backhand::FilesystemWriter<'_> -impl<'a, R: core::fmt::Debug + backhand::ReadSeek> core::fmt::Debug for backhand::FilesystemWriter<'a, R> -pub fn backhand::Fragment::read(__deku_input_bits: &bitvec::slice::BitSlice<u8, bitvec::order::Msb0>, kind: backhand::kind::Kind) -> core::result::Result<(&bitvec::slice::BitSlice<u8, bitvec::order::Msb0>, Self), deku::error::DekuError> -pub fn backhand::Fragment::write(&self, __deku_output: &mut bitvec::vec::BitVec<u8, bitvec::order::Msb0>, kind: backhand::kind::Kind) -> core::result::Result<(), deku::error::DekuError> -pub fn backhand::Id::read(__deku_input_bits: &bitvec::slice::BitSlice<u8, bitvec::order::Msb0>, kind: backhand::kind::Kind) -> core::result::Result<(&bitvec::slice::BitSlice<u8, bitvec::order::Msb0>, Self), deku::error::DekuError> -pub fn backhand::Id::write(&self, __deku_output: &mut bitvec::vec::BitVec<u8, bitvec::order::Msb0>, kind: backhand::kind::Kind) -> core::result::Result<(), deku::error::DekuError> -impl deku::DekuRead<'_, (u64, u32, u16, backhand::kind::Kind)> for backhand::Inode -pub fn backhand::Inode::read(__deku_input_bits: &bitvec::slice::BitSlice<u8, bitvec::order::Msb0>, (bytes_used, block_size, block_log, kind): (u64, u32, u16, backhand::kind::Kind)) -> core::result::Result<(&bitvec::slice::BitSlice<u8, bitvec::order::Msb0>, Self), deku::error::DekuError> -impl deku::DekuWrite<(u64, u32, u16, backhand::kind::Kind)> for backhand::Inode -pub fn backhand::Inode::write(&self, __deku_output: &mut bitvec::vec::BitVec<u8, bitvec::order::Msb0>, (bytes_used, block_size, block_log, kind): (u64, u32, u16, backhand::kind::Kind)) -> core::result::Result<(), deku::error::DekuError> -pub backhand::Node::path: std::path::PathBuf -pub fn backhand::Node::new(path: std::path::PathBuf, inner: backhand::InnerNode<T>) -> Self -impl<T: core::cmp::Eq> core::cmp::Eq for backhand::Node<T> -impl<T: core::cmp::PartialEq> core::cmp::PartialEq<backhand::Node<T>> for backhand::Node<T> -pub fn backhand::Node::eq(&self, other: &backhand::Node<T>) -> bool -impl<T> core::marker::StructuralEq for backhand::Node<T> -impl<T> core::marker::StructuralPartialEq for backhand::Node<T> -pub backhand::Squashfs::data_and_fragments: alloc::vec::Vec<u8> -impl<R: backhand::ReadSeek> backhand::Squashfs<R> -impl<R: backhand::ReadSeek> backhand::Squashfs<R> -pub fn backhand::Squashfs::from_reader(reader: R) -> core::result::Result<backhand::Squashfs<R>, backhand::BackhandError> -pub fn backhand::Squashfs::into_filesystem_reader(self) -> core::result::Result<backhand::FilesystemReader<R>, backhand::BackhandError> -impl<R: backhand::ReadSeek> backhand::Squashfs<SquashfsReaderWithOffset<R>> -pub fn backhand::Squashfs::from_reader_with_offset(reader: R, offset: u64) -> core::result::Result<backhand::Squashfs<SquashfsReaderWithOffset<R>>, backhand::BackhandError> -pub fn backhand::Squashfs::from_reader_with_offset_and_kind(reader: R, offset: u64, kind: backhand::kind::Kind) -> core::result::Result<backhand::Squashfs<SquashfsReaderWithOffset<R>>, backhand::BackhandError> -pub backhand::SquashfsBlockDevice::header: backhand::NodeHeader -pub backhand::SquashfsCharacterDevice::header: backhand::NodeHeader -pub backhand::SquashfsDir::header: backhand::NodeHeader -pub backhand::SquashfsFileReader::header: backhand::NodeHeader -pub struct backhand::SquashfsFileWriter<'a, R: backhand::ReadSeek> -pub backhand::SquashfsFileWriter::header: backhand::NodeHeader -pub backhand::SquashfsFileWriter::reader: backhand::SquashfsFileSource<'a, R> -impl<'a, R: backhand::ReadSeek> core::fmt::Debug for backhand::SquashfsFileWriter<'a, R> -pub backhand::SquashfsSymlink::header: backhand::NodeHeader -pub const backhand::SuperBlock::NOT_SET: u64 -pub fn backhand::SuperBlock::read(__deku_input_bits: &bitvec::slice::BitSlice<u8, bitvec::order::Msb0>, kind: backhand::kind::Kind) -> core::result::Result<(&bitvec::slice::BitSlice<u8, bitvec::order::Msb0>, Self), deku::error::DekuError> -pub fn backhand::SuperBlock::write(&self, __deku_output: &mut bitvec::vec::BitVec<u8, bitvec::order::Msb0>, kind: backhand::kind::Kind) -> core::result::Result<(), deku::error::DekuError> -pub trait backhand::ReadSeek: std::io::Read + std::io::Seek -impl<T: std::io::Read + std::io::Seek> backhand::ReadSeek for T Changed items in the public API =============================== -pub struct backhand::Export(pub u64) +pub struct backhand::Export -pub struct backhand::FilesystemReader<R: backhand::ReadSeek> +pub struct backhand::FilesystemReader -pub struct backhand::FilesystemReaderFile<'a, R: backhand::ReadSeek> +pub struct backhand::FilesystemReaderFile<'a> -pub struct backhand::FilesystemWriter<'a, R: backhand::ReadSeek> +pub struct backhand::FilesystemWriter<'a> -pub struct backhand::Id(pub u32) +pub struct backhand::Id -pub struct backhand::Squashfs<R: backhand::ReadSeek> +pub struct backhand::Squashfs Added items to the public API ============================= +pub struct backhand::compression::DefaultCompressor +impl backhand::compression::CompressionAction for backhand::compression::DefaultCompressor +impl backhand::compression::CompressionAction for backhand::compression::DefaultCompressor +pub fn backhand::compression::DefaultCompressor::compress(&self, bytes: &[u8], fc: backhand::FilesystemCompressor, block_size: u32) -> core::result::Result<alloc::vec::Vec<u8>, backhand::BackhandError> +pub fn backhand::compression::DefaultCompressor::decompress(&self, bytes: &[u8], out: &mut alloc::vec::Vec<u8>, compressor: backhand::compression::Compressor) -> core::result::Result<(), backhand::BackhandError> +impl core::clone::Clone for backhand::compression::DefaultCompressor +pub fn backhand::compression::DefaultCompressor::clone(&self) -> backhand::compression::DefaultCompressor +impl core::marker::Copy for backhand::compression::DefaultCompressor +pub trait backhand::compression::CompressionAction +pub fn backhand::compression::CompressionAction::compress(&self, bytes: &[u8], fc: backhand::FilesystemCompressor, block_size: u32) -> core::result::Result<alloc::vec::Vec<u8>, backhand::BackhandError> +pub fn backhand::compression::CompressionAction::compress(&self, bytes: &[u8], fc: backhand::FilesystemCompressor, block_size: u32) -> core::result::Result<alloc::vec::Vec<u8>, backhand::BackhandError> +pub fn backhand::compression::CompressionAction::decompress(&self, bytes: &[u8], out: &mut alloc::vec::Vec<u8>, compressor: backhand::compression::Compressor) -> core::result::Result<(), backhand::BackhandError> +pub fn backhand::compression::CompressionAction::decompress(&self, bytes: &[u8], out: &mut alloc::vec::Vec<u8>, compressor: backhand::compression::Compressor) -> core::result::Result<(), backhand::BackhandError> +pub fn backhand::kind::Kind::from_const(inner: InnerKind<dyn backhand::compression::CompressionAction>) -> core::result::Result<backhand::kind::Kind, alloc::string::String> +pub fn backhand::kind::Kind::from_kind(kind: &backhand::kind::Kind) -> backhand::kind::Kind +pub fn backhand::kind::Kind::from_target(s: &str) -> core::result::Result<backhand::kind::Kind, alloc::string::String> +pub fn backhand::kind::Kind::new<C: backhand::compression::CompressionAction>(compressor: &'static C) -> Self +pub fn backhand::kind::Kind::new_with_const<C: backhand::compression::CompressionAction>(compressor: &'static C, c: InnerKind<dyn backhand::compression::CompressionAction>) -> Self +pub backhand::BackhandError::DuplicatedFileName +pub backhand::BackhandError::InvalidFilePath +pub backhand::BackhandError::UndefineFileName +pub enum backhand::SquashfsFileWriter<'a> +pub backhand::SquashfsFileWriter::Consumed(usize, Added) +pub backhand::SquashfsFileWriter::SquashfsFile(backhand::FilesystemReaderFile<'a>) +pub backhand::SquashfsFileWriter::UserDefined(core::cell::RefCell<alloc::boxed::Box<(dyn std::io::Read + 'a)>>) +impl<'a> core::fmt::Debug for backhand::SquashfsFileWriter<'a> +pub backhand::Export::num: u64 +impl deku::DekuRead<'_, deku::ctx::Endian> for backhand::Export +pub fn backhand::Export::read(__deku_input_bits: &bitvec::slice::BitSlice<u8, bitvec::order::Msb0>, type_endian: deku::ctx::Endian) -> core::result::Result<(&bitvec::slice::BitSlice<u8, bitvec::order::Msb0>, Self), deku::error::DekuError> +impl deku::DekuWrite<deku::ctx::Endian> for backhand::Export +pub fn backhand::Export::write(&self, __deku_output: &mut bitvec::vec::BitVec<u8, bitvec::order::Msb0>, type_endian: deku::ctx::Endian) -> core::result::Result<(), deku::error::DekuError> +pub fn backhand::FilesystemCompressor::options(&mut self, options: backhand::compression::CompressionOptions) -> core::result::Result<(), backhand::BackhandError> +pub backhand::FilesystemReader::root: Nodes<backhand::SquashfsFileReader> +impl backhand::FilesystemReader +pub fn backhand::FilesystemReader::alloc_read_buffers(&self) -> (alloc::vec::Vec<u8>, alloc::vec::Vec<u8>) +pub fn backhand::FilesystemReader::file<'a>(&'a self, basic_file: &'a backhand::BasicFile) -> backhand::FilesystemReaderFile<'_> +pub fn backhand::FilesystemReader::files(&self) -> impl core::iter::traits::iterator::Iterator<Item = &backhand::Node<backhand::SquashfsFileReader>> +pub fn backhand::FilesystemReader::from_reader<R: backhand::BufReadSeek + 'static>(reader: R) -> core::result::Result<Self, backhand::BackhandError> +pub fn backhand::FilesystemReader::from_reader_with_offset<R: backhand::BufReadSeek + 'static>(reader: R, offset: u64) -> core::result::Result<Self, backhand::BackhandError> +pub fn backhand::FilesystemReader::from_reader_with_offset_and_kind<R: backhand::BufReadSeek + 'static>(reader: R, offset: u64, kind: backhand::kind::Kind) -> core::result::Result<Self, backhand::BackhandError> +impl<'a> backhand::FilesystemReaderFile<'a> +pub fn backhand::FilesystemReaderFile::new(system: &'a backhand::FilesystemReader, basic: &'a backhand::BasicFile) -> Self +pub fn backhand::FilesystemReaderFile::reader(&self, buf_read: &'a mut alloc::vec::Vec<u8>, buf_decompress: &'a mut alloc::vec::Vec<u8>) -> backhand::SquashfsReadFile<'_> +impl<'a> core::clone::Clone for backhand::FilesystemReaderFile<'a> +impl<'a> core::iter::traits::collect::IntoIterator for backhand::FilesystemReaderFile<'a> +impl<'a> core::marker::Copy for backhand::FilesystemReaderFile<'a> +impl<'a> backhand::FilesystemWriter<'a> +pub fn backhand::FilesystemWriter::from_fs_reader(reader: &'a backhand::FilesystemReader) -> core::result::Result<Self, backhand::BackhandError> +pub fn backhand::FilesystemWriter::mut_file<S: core::convert::AsRef<std::path::Path>>(&mut self, find_path: S) -> core::option::Option<&mut backhand::SquashfsFileWriter<'a>> +pub fn backhand::FilesystemWriter::push_block_device<P: core::convert::AsRef<std::path::Path>>(&mut self, device_number: u32, path: P, header: backhand::NodeHeader) -> core::result::Result<(), backhand::BackhandError> +pub fn backhand::FilesystemWriter::push_char_device<P: core::convert::AsRef<std::path::Path>>(&mut self, device_number: u32, path: P, header: backhand::NodeHeader) -> core::result::Result<(), backhand::BackhandError> +pub fn backhand::FilesystemWriter::push_dir<P: core::convert::AsRef<std::path::Path>>(&mut self, path: P, header: backhand::NodeHeader) -> core::result::Result<(), backhand::BackhandError> +pub fn backhand::FilesystemWriter::push_dir_all<P: core::convert::AsRef<std::path::Path>>(&mut self, path: P, header: backhand::NodeHeader) -> core::result::Result<(), backhand::BackhandError> +pub fn backhand::FilesystemWriter::push_file<P: core::convert::AsRef<std::path::Path>>(&mut self, reader: impl std::io::Read + 'a, path: P, header: backhand::NodeHeader) -> core::result::Result<(), backhand::BackhandError> +pub fn backhand::FilesystemWriter::push_symlink<P: core::convert::AsRef<std::path::Path>, S: core::convert::Into<std::path::PathBuf>>(&mut self, link: S, path: P, header: backhand::NodeHeader) -> core::result::Result<(), backhand::BackhandError> +pub fn backhand::FilesystemWriter::replace_file<S: core::convert::AsRef<std::path::Path>>(&mut self, find_path: S, reader: impl std::io::Read + 'a) -> core::result::Result<(), backhand::BackhandError> +pub fn backhand::FilesystemWriter::set_no_padding(&mut self) +pub fn backhand::FilesystemWriter::write<W: std::io::Write + std::io::Seek>(&mut self, w: &mut W) -> core::result::Result<(backhand::SuperBlock, u64), backhand::BackhandError> +pub fn backhand::FilesystemWriter::write_with_offset<W: std::io::Write + std::io::Seek>(&mut self, w: &mut W, offset: u64) -> core::result::Result<(backhand::SuperBlock, u64), backhand::BackhandError> +impl<'a> core::default::Default for backhand::FilesystemWriter<'a> +impl<'a> core::fmt::Debug for backhand::FilesystemWriter<'a> +impl backhand::Fragment +pub fn backhand::Fragment::new(start: u64, size: backhand::DataSize, unused: u32) -> Self +impl deku::DekuRead<'_, deku::ctx::Endian> for backhand::Fragment +pub fn backhand::Fragment::read(__deku_input_bits: &bitvec::slice::BitSlice<u8, bitvec::order::Msb0>, type_endian: deku::ctx::Endian) -> core::result::Result<(&bitvec::slice::BitSlice<u8, bitvec::order::Msb0>, Self), deku::error::DekuError> +impl deku::DekuWrite<deku::ctx::Endian> for backhand::Fragment +pub fn backhand::Fragment::write(&self, __deku_output: &mut bitvec::vec::BitVec<u8, bitvec::order::Msb0>, type_endian: deku::ctx::Endian) -> core::result::Result<(), deku::error::DekuError> +pub backhand::Id::num: u32 +pub const backhand::Id::SIZE: usize +pub fn backhand::Id::new(num: u32) -> backhand::Id +impl deku::DekuRead<'_, deku::ctx::Endian> for backhand::Id +pub fn backhand::Id::read(__deku_input_bits: &bitvec::slice::BitSlice<u8, bitvec::order::Msb0>, type_endian: deku::ctx::Endian) -> core::result::Result<(&bitvec::slice::BitSlice<u8, bitvec::order::Msb0>, Self), deku::error::DekuError> +impl deku::DekuWrite<deku::ctx::Endian> for backhand::Id +pub fn backhand::Id::write(&self, __deku_output: &mut bitvec::vec::BitVec<u8, bitvec::order::Msb0>, type_endian: deku::ctx::Endian) -> core::result::Result<(), deku::error::DekuError> +impl backhand::Inode +pub fn backhand::Inode::new(id: InodeId, header: InodeHeader, inner: InodeInner) -> Self +impl deku::DekuRead<'_, (u64, u32, u16, deku::ctx::Endian)> for backhand::Inode +pub fn backhand::Inode::read(__deku_input_bits: &bitvec::slice::BitSlice<u8, bitvec::order::Msb0>, (bytes_used, block_size, block_log, type_endian): (u64, u32, u16, deku::ctx::Endian)) -> core::result::Result<(&bitvec::slice::BitSlice<u8, bitvec::order::Msb0>, Self), deku::error::DekuError> +impl deku::DekuWrite<(u64, u32, u16, deku::ctx::Endian)> for backhand::Inode +pub fn backhand::Inode::write(&self, __deku_output: &mut bitvec::vec::BitVec<u8, bitvec::order::Msb0>, (bytes_used, block_size, block_log, type_endian): (u64, u32, u16, deku::ctx::Endian)) -> core::result::Result<(), deku::error::DekuError> +pub backhand::Node::fullpath: std::path::PathBuf +pub backhand::Node::header: backhand::NodeHeader +pub fn backhand::Node::new_root(header: backhand::NodeHeader) -> Self +impl<T> core::cmp::Eq for backhand::Node<T> +impl<T> core::cmp::Ord for backhand::Node<T> +pub fn backhand::Node::cmp(&self, other: &Self) -> core::cmp::Ordering +impl<T> core::cmp::PartialEq<backhand::Node<T>> for backhand::Node<T> +pub fn backhand::Node::eq(&self, other: &Self) -> bool +impl<T> core::cmp::PartialOrd<backhand::Node<T>> for backhand::Node<T> +pub fn backhand::Node::partial_cmp(&self, other: &Self) -> core::option::Option<core::cmp::Ordering> +impl<T: core::clone::Clone> core::clone::Clone for backhand::Node<T> +pub fn backhand::Node::clone(&self) -> backhand::Node<T> +impl backhand::Squashfs +pub fn backhand::Squashfs::from_reader(reader: impl backhand::BufReadSeek + 'static) -> core::result::Result<backhand::Squashfs, backhand::BackhandError> +pub fn backhand::Squashfs::from_reader_with_offset(reader: impl backhand::BufReadSeek + 'static, offset: u64) -> core::result::Result<backhand::Squashfs, backhand::BackhandError> +pub fn backhand::Squashfs::from_reader_with_offset_and_kind(reader: impl backhand::BufReadSeek + 'static, offset: u64, kind: backhand::kind::Kind) -> core::result::Result<backhand::Squashfs, backhand::BackhandError> +pub fn backhand::Squashfs::into_filesystem_reader(self) -> core::result::Result<backhand::FilesystemReader, backhand::BackhandError> +pub fn backhand::Squashfs::superblock_and_compression_options(reader: &mut alloc::boxed::Box<dyn backhand::BufReadSeek>, kind: &backhand::kind::Kind) -> core::result::Result<(backhand::SuperBlock, core::option::Option<backhand::compression::CompressionOptions>), backhand::BackhandError> +impl core::marker::Copy for backhand::SquashfsBlockDevice +impl core::marker::Copy for backhand::SquashfsCharacterDevice +impl core::default::Default for backhand::SquashfsDir +pub fn backhand::SquashfsDir::default() -> backhand::SquashfsDir +impl core::marker::Copy for backhand::SquashfsDir +pub struct backhand::SquashfsReadFile<'a> +impl<'a> std::io::Read for backhand::SquashfsReadFile<'a> +pub fn backhand::SquashfsReadFile::read(&mut self, buf: &mut [u8]) -> std::io::error::Result<usize> +impl backhand::SuperBlock +impl deku::DekuRead<'_, ([u8; 4], u16, u16, deku::ctx::Endian)> for backhand::SuperBlock +pub fn backhand::SuperBlock::read(__deku_input_bits: &bitvec::slice::BitSlice<u8, bitvec::order::Msb0>, (ctx_magic, ctx_version_major, ctx_version_minor, ctx_type_endian): ([u8; 4], u16, u16, deku::ctx::Endian)) -> core::result::Result<(&bitvec::slice::BitSlice<u8, bitvec::order::Msb0>, Self), deku::error::DekuError> +impl deku::DekuWrite<([u8; 4], u16, u16, deku::ctx::Endian)> for backhand::SuperBlock +pub fn backhand::SuperBlock::write(&self, __deku_output: &mut bitvec::vec::BitVec<u8, bitvec::order::Msb0>, (ctx_magic, ctx_version_major, ctx_version_minor, ctx_type_endian): ([u8; 4], u16, u16, deku::ctx::Endian)) -> core::result::Result<(), deku::error::DekuError> +pub trait backhand::BufReadSeek: std::io::BufRead + std::io::Seek +impl<T: std::io::BufRead + std::io::Seek> backhand::BufReadSeek for T
unsquashfs
- Added
--kindfor custom squashfs type image extraction-k, --kind <KIND> Kind(type of image) to parse [default: le_v4_0] [possible values: be_v4_0, le_v4_0, amv_be_v4_0]
- Added
--completionsfor the generation of shell completions scriptsPerformance
See https://github.com/wcampbell0x2a/backhand/discussions/145 for more details. These are benchmarked against the SquashFS image from
TP-Link AXE5400 Mesh Wi-Fi 6E Range Extender.Speed
For single threaded mode
squashfs-tools/unsquashfs-v4.6.1, testing on my machine lets me know that ourbackhand/unsquashfsis around the same speed performance with a single thread.Allocations
Only testing single threaded mode, peak heap memory consumption for
squashfs-tools/unsquashfs-v4.6.1is 74.8MB, while ourbackhand/unsquashfsonly uses 18.1MB.
## wcampbell0x2a/statusbar
### v0.3.4Published: 2023-04-15 03:39:27 UTC | Tag:
v0.3.4
### v0.3.3Published: 2023-04-05 03:24:11 UTC | Tag:
v0.3.3
### v0.3.2Published: 2023-03-29 23:48:02 UTC | Tag:
v0.3.2
## wcampbell0x2a/backhand
### v0.11.0Published: 2023-03-15 03:49:46 UTC | Tag:
v0.11.0Added
- Support for Read/Write of non-standard custom squashfs images:
LE_V4_0: (linux kernel) Little-Endian default official v4.0BE_V4_0: Big-Endian v4.0AVM_BE_V4_0: AVM Fritz!OS firmware support.FilesystemWriter: Builder pattern used when mutating an image. This includes multiple functions for the public API. Supporting both raw images and modification made to images that already exist.FilesytemCompressor:.compressoris nowFilesystemCompressor, which holds the Id as well as options stored in the image as well as extra options only used when compressing when creating a new image.- Add error
InvalidCompressionOption- Change default XZ compression level to 6
- Support custom XZ filters for
FilesystemWriter- Return
(Superblock, bytes_written)forFilesystemWriter::write()- Update deku to 0.16.0
add: now reads file details to derive the details when the file is added the imageadd:--mtime,--uid,--gidand--permissionto override file details derived from fileunsquashfs: now correctly extracts ownership and permission detailsFixed
IDnow supports multiple IDs for GUI and UID in the tableid_tableis now properly a u64 pointer- Data is now not copied when during the use of a
FilesystemWriteryou decide to change the compression used. Thanks @rbranChanged
- Renamed
SquashfsErrortoBackhandError
### v0.10.1Published: 2023-02-23 04:26:46 UTC | Tag:
v0.10.1Added
- Zstd compression support
Fixed
FilesystemWriterDebug impl now worksFilesystemReader::from_reader_with_offset(..)now properly respects given offsetsFilesystemWriter::write_with_offset(..)now properly respects given offsets
### v0.10.0Published: 2023-02-21 03:46:40 UTC | Tag:
v0.10.0Added
- Fuzz testing with
cargo fuzz. Mostly fuzz bytes as bytes/image input into this library.unsquashfs: Add-o, --out <OUT>flag for output squashfs image destinationreplace: Add binary to replace file in squashfs filesystems- Add support for Lzo compression, and feature
lzoFixed
- Fixed many issues found with fuzz testing related to legal images. Checks are now added at every stop possible to prevent many soundness issues.
- Fixed
Compressorid values for Lzo and LzmaChanged
- Pass internal raw data by reference, improving
only_readbenchmarks by ~9%.- Invalid
Superblock.block_sizeis now checked against MiB(1) instead of MB(1)
### v0.9.1Published: 2023-02-16 14:46:26 UTC | Tag:
v0.9.1
### v0.9.0Published: 2023-02-14 03:38:49 UTC | Tag:
v0.9.0See CHANGELOG.
Fixed
FilesystemWriter::push_file(..)correctly enters file into filesystemChanged
- Remove Result return type from
FilesystemWriter::{push_file(..), push_dir(..), push_symlink(..), push_char_device(..) and push_block_devivce(..).- Remove unused errors:
FieldNotInitializedandOsStringToStr.
### v0.8.1Published: 2023-02-12 03:37:32 UTC | Tag:
v0.8.1See CHANGELOG
Release engineering is hard ;)
### v0.8.0Published: 2023-02-12 03:23:57 UTC | Tag:
v0.8.0See CHANGELOG.
## wcampbell0x2a/zerus
### v0.4.0Published: 2023-02-03 04:10:13 UTC | Tag:
v0.4.0
- Update example usage of spare-registry in readme to latest stabilized config
- Fix path of crates of filename length 3
- Add example config.json to README
## wcampbell0x2a/backhand
### v0.7.0Published: 2023-01-24 02:34:46 UTC | Tag:
v0.7.0See CHANGELOG.md
### v0.6.0Published: 2023-01-11 04:37:33 UTC | Tag:
v0.6.0
- Fix bug in our filesystem tree causing directory header information (gui, uid, permissions) to not be saved in resulting filesystem when calling
Filesystem::to_bytes(..).- Rework
filesystem::Nodeto be a struct containing the path andInnerNode. This cleans up the inner implementation of the file system tree.- Make more types public that are useful for Squashfs detailed introspection
- Improve documentation
### v0.5.0Published: 2023-01-09 03:38:57 UTC | Tag:
v0.5.0
- Fix warning when compression options isn't standard size
- In
from_reader(..), show info about flags used- Add
Filesystem::from_reader(..)andFilesystem::from_reader_with_offset(..)which callsSquashfs::from_reader(..)andSquashfs::from_reader_with_offset(..)andSquashfs::into_filesystem(..).- 5% Performance increases due to using
Vec::with_capacity(..)forfragment_bytes- Add Block and Char Device support for Reading and Writing
- Fix error with
inode_offsetmis-calculation- Fix tail-end fragment support for reading image
- Fix
unsquashfsfile path extraction