# 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.1

Published: 2026-01-18 18:59:20 UTC | Tag: v0.24.1

backhand

backhand-cli

  • Update dependencies

## sharksforarms/deku

### deku-v0.20.3

Published: 2026-01-15 14:35:54 UTC | Tag: deku-v0.20.3

Fixed

  • DekuSize: Add padding size calculation (#640)
  • DekuSize: Add magic enum/struct field/top-level (#639)
  • DekuSize: Disallow seek attributes for struct/enums and fields (#638)

## wcampbell0x2a/compact-calendar-cli

### v0.2.0

Published: 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
readme(1)

## wcampbell0x2a/outsider

### v0.4.1

Published: 2026-01-06 13:14:19 UTC | Tag: v0.4.1

  • Require --project if multiple yaml projects are detected
  • Require --source-dir if artifacts.yml is detected as being in the current dir
  • Add example of using --source-dir in the README

### v0.4.0

Published: 2026-01-06 04:56:38 UTC | Tag: v0.4.0

  • Default YML_FILE to artifacts.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.0

Published: 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.0

Published: 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.0

Published: 2025-12-31 17:28:50 UTC | Tag: v0.2.0

  • Initial Release

## wcampbell0x2a/no-std-io2

### v0.9.3

Published: 2025-12-29 20:14:08 UTC | Tag: v0.9.3

What'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.0

Published: 2025-12-29 18:53:05 UTC | Tag: v0.1.0

Initial Release

readme

## wcampbell0x2a/librarium

### v0.5.0

Published: 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.0

Published: 2025-12-22 03:50:15 UTC | Tag: v0.6.0

  • Multi-threaded downloads
  • dl now includes progress bar
  • Add tests

## wcampbell0x2a/heretek

### v0.8.0

Published: 2025-12-16 02:17:15 UTC | Tag: v0.8.0

  • Add Source improvements:
    • Add Source display page
    • Add Source highlight support for Rust, C, and C++ using arborium (treesitter).
  • Send child process stderr to null
  • Resolve info addresses with another symbol address lookup in Symbol page.
  • Poll slower when not expecting gdb response

readme

## wcampbell0x2a/backhand

### v0.24.0

Published: 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_0
  • le_v3_0
  • be_v3_0_lzma
  • le_v3_0_lzma
  • netgear_be_v3_0_lzma
  • netgear_le_v3_0_lzma

Features:

  • v3
  • v3_lzma

As 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 of Vec

backhand-cli

  • unsquashfs: Try all kinds by default when --kind isn't specified
  • unsquashfs: Improve error output
  • Update to 2024 edition
  • Bump MSRV to 1.86

## wcampbell0x2a/no-std-io2

### v0.9.2

Published: 2025-11-28 14:15:19 UTC | Tag: v0.9.2

What's Changed

  • Add Box<Read>, Box<Write>, Box<Seek>, Box<BufRead> by @wcampbell0x2a in https://github.com/wcampbell0x2a/no-std-io2/pull/22

Full Changelog: https://github.com/wcampbell0x2a/no-std-io2/compare/v0.9.1...v0.9.2

## sharksforarms/deku

### deku-v0.20.2

Published: 2025-11-25 21:34:17 UTC | Tag: deku-v0.20.2

Other

  • Fix recursive DekuSize impl (#628)

### deku-v0.20.1

Published: 2025-11-25 01:58:48 UTC | Tag: deku-v0.20.1

Added

  • Add DekuSize impl (#618)

Other

  • Uphold alignment requirements for use of Seek (#625)
  • Improved documentation on how endian etc. interacts with ctx (#623)
  • Lift alloc requirement for bits feature (#614)

## wcampbell0x2a/heretek

### v0.7.0

Published: 2025-11-15 04:40:13 UTC | Tag: v0.7.0

  • Hexdump memory mapping selection using H #192
  • Add symbol selection screen and asm printing #192
  • Add quit confirmation #192

readme

## sharksforarms/deku

### deku-v0.20.0

Published: 2025-10-15 20:17:57 UTC | Tag: deku-v0.20.0

Fixed

  • remove unsafe slice MaybeUninit::uninit().assume_init() (#601)

Added

  • The alloc feature, allowing use in environments lacking a heap #582
  • The descriptive-errors feature, replacing no-assertion-string #582

Other

  • 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 alloc as a selectable feature (#582)
  • Removed duplicate bits entry from the 'List of attributes' section of attributes docs (#588)
  • Fix DekuRead for #[repr(...)] enums constructed using id via ctx and 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.1

Published: 2025-10-12 19:27:57 UTC | Tag: v0.9.1

  • Fix BufWriter panic #19

## wcampbell0x2a/heretek

### v0.6.0

Published: 2025-09-02 02:40:00 UTC | Tag: v0.6.0

  • Set disassembly-flavor to intel #164
  • Auto detect arch ptr size #153
  • Remove panic on empty memory mapping #149
  • Nicely bail on errors #146
  • Improve --cmds help message #154
  • Major code refactor #142
  • Fixes for debugging riscv #175
  • Display source when available #186
image

## wcampbell0x2a/outsider

### v0.3.0

Published: 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.0

Published: 2025-07-03 23:17:18 UTC | Tag: v0.2.0

  • Default --source-dir to .

## wcampbell0x2a/backhand

### v0.23.0

Published: 2025-06-20 04:01:44 UTC | Tag: v0.23.0

backhand

  • Add feature parallel, which enables internal parallelization when de-compressing data. When parallel is 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 liblzma instead of xz2. This bumps the version of XZ used to 5.8.1. (#712)
    • This also removes the need for HAVE_DECODER defines/CFLAGS when building xz, as liblzma enables them when building by default.

backhand-cli

  • unsquashfs: Properly flush the file writer

backhand-cli

  • Use backhand features parallel by default (and in release builds). Exposed by using backhand-parallel.

## sharksforarms/deku

### v0.19.1

Published: 2025-05-22 14:48:57 UTC | Tag: deku-v0.19.1

What'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.0

Published: 2025-05-03 15:17:01 UTC | Tag: v0.3.0

  • Update deku to 0.19.0

## wcampbell0x2a/librarium

### v0.4.0

Published: 2025-05-03 13:47:05 UTC | Tag: v0.4.0

  • Update deku to v0.19.0 (https://github.com/wcampbell0x2a/librarium/pull/58)

## wcampbell0x2a/backhand

### v0.22.0

Published: 2025-05-03 03:58:54 UTC | Tag: v0.22.0

backhand

  • Update deku to v0.19.0 (#710)
  • Update MSRV to 1.84

backhand-cli

  • Update MSRV to 1.84

## sharksforarms/deku

### v0.19.0

Published: 2025-04-25 18:55:42 UTC | Tag: deku-v0.19.0

Features

Added bit_order (#483)

After much development, bit_order is now a supported attribute! Msb is still the default bit-order for all operations, but if you need Lsb ordering, 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 reader the following changed. As well as the leftover field 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_pat attribute has been restored to the behavior of 0.16.0, removing the seek and re-read.

Allow token streams for bytes attribute (#489)

# #[derive(Debug, PartialEq, DekuRead, DekuWrite)]
struct DekuTest {
    field_a_size: u8,
    #[deku(bytes = "*field_a_size as usize")]
    field_a: u32,
}

Updates

  • Arc support by @vhdirk (#522)
  • Update no-std-io2 to 0.9.0 and Updated MSRV to 1.81 (#529)
  • Add field support for magic attribute (#503)
  • Add NoSeek type for unseekable Read + Write impls (#487)
  • Add performance specializations for count attribute + Vec<u8>(#481)
  • Reader may now take ownership of Read + Seek type. Thanks @wgreenburg (#521).

Fixes

  • Fix pad_* attributes in no_std (#478)
  • Fix bug with id_pat and read_bytes_const (#479)
  • Several fixes for scope and imports in proc-macros, thanks @Serial-ATA (#541, #538, #539)

## wcampbell0x2a/heretek

### v0.5.1

Published: 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/outsider

### v0.1.2

Published: 2025-04-13 20:44:31 UTC | Tag: v0.1.2

## wcampbell0x2a/backhand

### v0.21.0

Published: 2025-03-08 21:48:12 UTC | Tag: v0.21.0

backhand

  • Use zlib-rs as the default implementation for flate2, added feature gzip-zlib-ng to access previous behavior (#697)
  • Remove gzip-zune-inflate, as this had minimal usage (#697)
  • Bump MSRV to 1.81 (#693)
  • Add lz4 compression and decompression, thanks @jeromegn! (#701)

## wcampbell0x2a/heretek

### v0.5.0

Published: 2025-02-10 04:02:43 UTC | Tag: v0.5.0

  • Add Tab completion to show possible completions and overwrite if singular #134
  • Show -stack-list-frames otherwise known as Backtrace when available #129
  • Add more documentation showing more usage of heretek in Hexdump and Normal usage #128
  • Try and deref the entire string when looking at a memory address #127
  • Update depends

## wcampbell0x2a/zerus

### v0.11.0

Published: 2025-02-10 03:51:22 UTC | Tag: v0.11.0

  • Add -V for 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.0

Published: 2025-01-20 02:18:59 UTC | Tag: v0.5.0

### v0.4.0

Published: 2025-01-20 01:58:32 UTC | Tag: v0.4.0

What'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/backhand

### v0.20.0

Published: 2025-01-18 14:29:58 UTC | Tag: v0.20.0

backhand

  • Remove incorrect check for ExtendedDirectory index count (#691)
  • Correctly support ExtendedFile (#691)

## wcampbell0x2a/heretek

### v0.4.0

Published: 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 --cmds to cmd history #118
  • Ignore # comment lines in --cmds #119

### v0.3.0

Published: 2025-01-10 03:52:59 UTC | Tag: v0.3.0

  • Adjusted size of UI elements in Main View #102
  • Add --gdb-path to override gdb executated #101
  • Show Running in status #106
  • Allow control+c to send SIGINT to process #106
    • Always use mi-async
    • Override continue into -exec-continue
    • Override stepi into -exec-step-instruction
    • Override step into -exec-step
  • Change --cmd into --cmds and from using gdb> source to just running each line as a gdb cmd #106
  • Add --log-path to control log location and remove writing to app.log by default #108
  • Change RUST_LOG env to info as default #108

## wcampbell0x2a/no-std-io2

### v0.9.0

Published: 2025-01-04 18:30:02 UTC | Tag: v0.9.0

  • Support io errors with arbitrary payloads in "alloc" mode #11
  • Implement Write for Cursor<Vec<u8>> #10
  • Restore io::ErrorKind::Unsupported, add io::ErrorKind::OutOfMemory #8
  • Use core::error, bump MSRV to 1.81 #9

Thanks @sunfishcode for his contributions!

## wcampbell0x2a/heretek

### v0.2.0

Published: 2025-01-03 04:36:04 UTC | Tag: v0.2.0

  • Remove --local argument, heretek now runs gdb locally by default #96
  • hexdump: Resolve ~/ in path for Saving #97
  • hexdump: Speed up by only computing what is needed for display #98
  • output/memory/hexdump: Add G hotkey to goto bottom #98

### v0.1.0

Published: 2025-01-02 02:26:10 UTC | Tag: v0.1.0

Initial Release

### v0.1.0-rc12

Published: 2024-12-23 02:10:20 UTC | Tag: v0.1.0-rc12

### v0.1.0-rc11

Published: 2024-12-18 01:02:41 UTC | Tag: v0.1.0-rc11

### v0.1.0-rc10

Published: 2024-12-17 03:42:11 UTC | Tag: v0.1.0-rc10

### v0.1.0-rc9

Published: 2024-12-17 02:23:06 UTC | Tag: v0.1.0-rc9

### v0.1.0-rc8

Published: 2024-12-16 00:45:07 UTC | Tag: v0.1.0-rc8

### v0.1.0-rc7

Published: 2024-12-12 05:14:03 UTC | Tag: v0.1.0-rc7

### v0.1.0-rc6

Published: 2024-12-10 03:38:58 UTC | Tag: v0.1.0-rc6

### v0.1.0-rc5

Published: 2024-12-09 04:03:18 UTC | Tag: v0.1.0-rc5

### v0.1.0-rc4

Published: 2024-12-09 03:57:48 UTC | Tag: v0.1.0-rc4

### v0.1.0-rc3

Published: 2024-12-06 04:35:05 UTC | Tag: v0.1.0-rc3

### v0.1.0-rc2

Published: 2024-12-05 05:41:31 UTC | Tag: v0.1.0-rc2

### v0.1.0-rc1

Published: 2024-12-04 05:01:04 UTC | Tag: v0.1.0-rc1

### v0.1.0-rc0

Published: 2024-12-03 05:26:49 UTC | Tag: v0.1.0-rc0

## wcampbell0x2a/backhand

### v0.19.0

Published: 2024-12-01 22:57:38 UTC | Tag: v0.19.0

backhand

  • Use feature zlib-ng for flate2, which is enabled when compression option Gzip is 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 the add and replace binaries. This is controllable with FilesystemWriter::set_no_duplicate_files. (#603), (#594)
  • Increase speed of internal HashMaps, by switching to xxhash and just using the inode as the key in other places.
  • Changed SuperBlock::Flags to be public.
  • Add non-standard CompressionOptions support (#584)
    • Add CompressionAction::compression_options to override the default compression options emitted during writing.
    • Add FilesystemWriter::set_emit_compression_options
  • Support sparse file extraction (#624)
  • Add x86_64-pc-windows-gnu support (@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-options to add and replace to remove compression options from image after modification.
  • Add --pad-len to replace and add to control the length of end-of-image padding (#604)
  • Bump MSRV to 1.77

Dependencies

  • Bump thiserror from 1.0.59 to 2.0.1 (#564, #578, #615, #633)
  • Bump libc from 0.2.154 to 0.2.162 (#557, #592, #616, #630)
  • Bump clap from 4.5.4 to 4.5.13 (#569, #574, #582)
  • Bump rustc-hash from 1.1.0 to 2.0.0 (#570)
  • Bump clap_complete from 4.5.2 to 4.5.13 (#575, #595)
  • Bump document-features from 0.2.8 to 0.2.10 (#576)
  • Bump zstd-safe from 7.1.0 to 7.2.1 (#585)
  • Bump flate2 from 1.0.30 to 1.0.35 (#593, #596, #617, #641)
  • Bump zstd from 0.13.1 to 0.13.2 (#601)
  • Bump env_logger from 0.11.3 to 0.11.5 (#602)
  • Bump libdeflater from 1.21.0 to 1.22.0 (#619)
  • Bump tempfile from 3.12.0 to 3.13.0 (#618)
  • Bump nix from 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.1

Published: 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.0

Published: 2024-11-09 22:13:55 UTC | Tag: v0.3.0

  • Initial release of ureq fork

## wcampbell0x2a/librarium

### v0.3.0

Published: 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.2

Published: 2024-10-25 03:51:26 UTC | Tag: v0.1.2

Publish on crates.io

### v0.1.1

Published: 2024-10-25 03:48:13 UTC | Tag: v0.1.1

## wcampbell0x2a/aftermath

### v0.1.1

Published: 2024-10-25 03:45:36 UTC | Tag: v0.1.1

Publish on crates.io

### v0.1.0

Published: 2024-10-25 03:29:01 UTC | Tag: v0.1.0

Initial Release

## wcampbell0x2a/kokiri

### v0.1.0

Published: 2024-10-25 03:26:52 UTC | Tag: v0.1.0

Initial Release

## wcampbell0x2a/zerus

### v0.10.1

Published: 2024-10-25 03:02:53 UTC | Tag: v0.10.1

  • Add lto to github release binaries

## wcampbell0x2a/income

### v0.2.0

Published: 2024-10-22 03:23:23 UTC | Tag: v0.2.0

  • Initial working release

## wcampbell0x2a/zerus

### v0.10.0

Published: 2024-10-22 02:37:40 UTC | Tag: v0.10.0

Updates

  • Add instructions for use with integer32llc/Margo
  • Add --git-index-url to configure mirror config.json #95
  • Add check of status code when downloading #97
  • Add better message for not finding Cargo.toml #96

Dependencies

  • 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.1

Published: 2024-10-12 20:45:38 UTC | Tag: v0.8.1

  • Fix Write impl for alloc::Vec

## wcampbell0x2a/zerus

### v0.9.0

Published: 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.0

Published: 2024-09-27 03:31:09 UTC | Tag: v0.2.0

First official :tm: release

## sharksforarms/deku

### v0.18.0

Published: 2024-09-07 15:23:28 UTC | Tag: deku-v0.18.0

Usability

  • Reading now requires Seek. Attributes such as seek_from_start, seek_from_current, seek_from_end, and seek_rewind were added to be able to control the position of the reader before reading a field (#360)
  • Support added for unit structs (#450)
  • to_slice was 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_all was improved (#441)

Enum improvements

  • Added id_endian attribute to specify the endianness of id (#476)
  • Support for bool literals in enum id attribute (#472)
  • id_pat attribute was re-introduced (#454)

## wcampbell0x2a/zerus

### v0.8.1

Published: 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.0

Published: 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

## wcampbell0x2a/backhand

### v0.18.0

Published: 2024-05-25 04:15:43 UTC | Tag: v0.18.0

backhand

  • Update MSRV to 1.72.1 (#524)

Dependencies

  • Bump deku from 0.16.0 to 0.17.0 (#524)
  • Bump libc from 0.2.153 to 0.2.154 (#546)

## sharksforarms/deku

### v0.17.0

Published: 2024-05-24 03:29:46 UTC | Tag: deku-v0.17.0

Changes

  • Bumped MSRV to 1.71 (#438)
  • Add DekuWrite impl for [T] (#416)
  • Add no-assert-string feature to remove panic string on failed assertion (#405)
  • Add read_all attribute to read until reader.end() (#387)
  • Changed edition to 2021 (#389)
  • Refactored logging feature with massive usability increases (#352), (#355)
  • Bumped the syn library to 2.0, which required replacing type for Enums with id_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 DekuRead to DekuReader

For 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 with from_reader_with_ctx(..). With the switch to internal streaming, the variables deku::input, deku::input_bits, and deku::rest are now not possible and were removed. deku::reader is 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_pat is 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_generics was 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 DekuWrite to DekuWriter
  • The more internal (with context) write(..) was replaced with to_writer(..). With the switch to internal streaming, the variables deku::output are now not possible and were removed. deku::writer is 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::Write to denote io::Write errors

Bug fix

  • Fix error for invalid deku_id generation on generic enum (#411)

## wcampbell0x2a/backhand

### v0.17.0

Published: 2024-05-06 22:51:42 UTC | Tag: v0.17.0

Updates

  • Remove unused BufSeekRewind and SeekRewind traits (#550)
  • Fix docs.rs build (#550)

Dependencies

  • Bump flate2 from 1.0.28 to 1.0.30 (#547)

### v0.16.0

Published: 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 by FilesystemReader::reader() (#530)

backhand-cli

  • Add x86_64-apple-darwin support and release binary (#511)
  • Fix --help and correctly show gzip support when using gzip-zune-inflate (#538)
  • Fix --help and correctly show xz support when using xz-static (#541)

Dependencies

  • Bump zstd from 0.13.0 to 0.13.1 (#518)
  • Bump rayon from 1.9.0 to 1.10.0 (#512)
  • Bump codecov/codecov-action from 4.1.0 to 4.3.0 (#514, #526)
  • Bump obi1kenobi/cargo-semver-checks-action from 2.3 to 2.4 (#507)
  • Bump clap from 4.5.2 to 4.5.4 (#513)
  • Bump libdeflater from 1.19.3 to 1.20.0 (#523)
  • Bump dangoslen/dependabot-changelog-helper from 3.8.1 to 3.9.0 (#516)
  • Bump thiserror from 1.0.58 to 1.0.59 (#534)
  • Bump color-print from 0.3.5 to 0.3.6 (#537)
  • Bump clap_complete from 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.0

Published: 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.0

Published: 2024-03-24 19:23:46 UTC | Tag: v0.15.0

[v0.15.0] - 2024-03-24

backhand

  • Add support for Socket and NamedFIFO Inodes in library and extraction binaries. Thanks (@tnias) (#472, #470)
    • Add FilesytemWriter::push_fifo and FilesystemWriter::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-safe dependency (#504)
  • Added inlines to small public functions (#504)
  • Changed FilesystemReader.cache to RwLock to 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.74 for clap-4.5.1 update (#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-artifact from 4.1.0 to 4.3.1 (#435, #446, #465)
  • Bump env_logger from 0.10.1 to 0.10.2 (#432)
  • Bump rayon from 1.8.0 to 1.9.0 (#431, #496)
  • Bump clap from 4.4.17 to 4.5.2 (#428, #500)
  • Bump clap_complete from 4.4.7 to 4.5.1 (#444, #445, #482)
  • Bump codecov/codecov-action from 3.1.4 to 4.1.0 (#448, #457, #458, #462, #488, #493)
  • Bump obi1kenobi/cargo-semver-checks-action from 2.2 to 2.3 (#449)
  • Bump libc from 0.2.152 to 0.2.153 (#459)
  • Bump dangoslen/dependabot-changelog-helper from 3.7.0 to 3.8.0 (#461)
  • Bump thiserror from 1.0.56 to 1.0.58 (#476, #502)
  • Bump indicatif from 0.17.7 to 0.17.8 (#477)
  • Bump libdeflater from 1.19.0 to 1.19.3 (#486, #498)
  • Bump assert_cmd from 2.0.13 to 2.0.14 (#484)
  • Bump nix from 0.27.1 to 0.28.0 (#489)
  • Bump test-log from 0.2.14 to 0.2.15 (#492)
  • Bump tempfile from 3.9.0 to 3.10.1 (#491)
  • Bump actions/checkout from 4.1.1 to 4.1.2 (#501)

## wcampbell0x2a/zerus

### v0.6.0

Published: 2024-02-26 01:27:21 UTC | Tag: v0.6.0

  • Download crates in parallel

## wcampbell0x2a/bintex

### v0.1.0

Published: 2024-02-11 23:16:56 UTC | Tag: v0.1.0

  • Initial Release

## wcampbell0x2a/asterix-rs

### v0.4.0

Published: 2024-02-09 22:33:22 UTC | Tag: v0.4.0

  • Add support for the following 48/030 packets:
    • WrongDFReplyFormatDetected
    • TransponderAnomalyMs
    • TransponderAnomalySI
    • PotentialICConflict
    • ICConflictDetectionPossible
    • AMGAllocated(u16)
    • Manufacture(u16)

## wcampbell0x2a/zerus

### v0.5.0

Published: 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.0

Published: 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.2

Published: 2024-01-17 05:43:14 UTC | Tag: v0.14.2

backhand

  • Enable overflow-checks (#421)
  • Add feature gzip-zune-inflate to 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-inflate for dist build and speed improvements (#419)
  • Updated benchmarks to show improvement (#419)

Dependencies

  • Bump clap from 4.4.12 to 4.4.17 (#417, #424)
  • Bump thiserror from 1.0.53 to 1.0.56 (#404)
  • Bump actions/upload-artifact from 4.0.0 to 4.1.0 (#423)
  • Bump libc from 0.2.151 to 0.2.152 (#408)
  • Bump clap_complete from 4.4.5 to 4.4.7 (#426)
  • Bump assert_cmd from 2.0.12 to 2.0.13 (#422)
  • Bump console from 0.15.7 to 0.15.8 (#413)

### v0.14.1

Published: 2024-01-14 15:57:39 UTC | Tag: v0.14.1

backhand

Changes

  • Fix path to project README.md for crates.io

### v0.14.0

Published: 2024-01-13 20:03:28 UTC | Tag: v0.14.0

Major changes were made to the organization of this repo, with the library backhand now being separated from the backhand-cli package, which is used to install unsquashfs, replace, and add.

backhand

Changes

  • Following changes were done to allow multi-threaded applications (#278)
    • Change RefCell<Box<T>> into Arc<Mutex<T>>
    • Change RefCell<T> into Mutex<T>
    • Change Rc<T> into Arc<T>
    • Change dyn CompressionAction to dyn CompressionAction + Send + Sync for Kind uses
    • Change BufReadSeek: BufRead + Seek {} to BufReadSeek: 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::write with 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 Clone impl for FilesystemReaderFile (#277)
  • Increase DirectoryIndex::name_size length from 100 to 255. (@eatradish) (!282), Fixed: (#283)
  • Prevent push_file "file within file", will now return InvalidFilePath (@rbran) (#364)
  • Fix gid and uid for push_dir_all(..) (#360)

Security

  • Only allow root and simple filenames into DirEntry (@rbran) (#271)

backhand-cli

Changes to All

  • strip and LTO are enabled for release binaries
  • Fix macOS builds (#260)
  • Bump MSRV to 1.73.0 to use now stabilized std::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 --quiet for 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-musl
    • arm-unknown-linux-musleabi
    • x86_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-assets with ureq (#264)
  • Replace zune-inflate with libdeflater for custom decompression testing for reliability (#325)

Dependencies

  • Bump flate2 from 1.0.26 to 1.0.28 (#307)
  • Bump jemallocator from 0.5.0 to 0.5.4 (#305)
  • Bump env_logger from 0.10.0 to 0.10.1 (#341)
  • Bump clap from 4.4.7 to 4.4.12 (#340, #371, #376, #399)
  • Bump dangoslen/dependabot-changelog-helper from 3.5.0 to 3.7.0 (#342, #369)
  • Bump tracing-subscriber from 0.3.17 to 0.3.18 (#347)
  • Bump byte-unit from 4.0.19 to 5.0.3 (#367)
  • Bump actions/labeler from 4 to 5 (#377)
  • Bump test-log from 0.2.13 to 0.2.14 (#378)
  • Bump clap_complete from 4.4.4 to 4.4.5 (#393)
  • Bump thiserror from 1.0.51 to 1.0.53 (#391, #401)
  • Bump actions/upload-artifact from 3.1.3 to 4.0.0 (#380)
  • Bump tempfile from 3.8.1 to 3.9.0 (#398)
  • Bump document-features from 0.2.7 to 0.2.8 (#400)

## wcampbell0x2a/mempeek

### v0.1.5

Published: 2023-12-13 04:55:26 UTC | Tag: v0.1.5

## wcampbell0x2a/asterix-rs

### v0.3.1

Published: 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.1

Published: 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.5

Published: 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.0

Published: 2023-09-11 02:06:26 UTC | Tag: v0.4.0

  • Further update panic string format to match rust std

## wcampbell0x2a/backhand

### v0.13.0

Published: 2023-06-19 02:49:41 UTC | Tag: v0.13.0

backhand

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 lzo being a default feature because of GPL license (#240)
  • Add support for OpenWRT compression options (#239)
  • Bump MSRV to 1.65.0 for latest clap requirements (#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..HEAD
Click 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]) -> Self

All binaries

Changes

  • jemalloc is now used for -musl release targets for performance reasons (#254)
  • HAVE_DECODER_ARM, HAVE_DECODER_ARM64, and HAVE_DECODER_ARMTHUMB filter flags are now defined for xz2. This only effects static build created in our CI. (#254)
  • Add RUST_LOG and available Decompressors to --help of all binaries (#242)

add

Changes

  • Add --dir to create a empty directory (#242)

Bug Fix

  • Add correctly reading new file metadata from --file, force other arguments for --dir (#254)

unsquashfs

Changes

  • Add --auto-offset for automatic finding of initial SquashFS offset in image (#241)
  • Add possible kind values to --help output (#236)
  • Add --path-filter to limit file extraction to a path (#237)

### v0.12.0

Published: 2023-05-07 21:02:24 UTC | Tag: v0.12.0

Thanks @rbran for the contributions!

backhand

  • Kind has been extended to take an CompressionAction to have a custom compression and decompression algorithm. This defaults to the DefaultCompressor in 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 of std::fs::create_dir_all and create required parent directories
  • Added FilesystemReader::files() and file() 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 adding alloc_read_buffers to 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>>( into push_file<P: AsRef<Path>>(. NOTE: The function will no longer create parent directories! Instead use new FilesytemWriter::push_dir_all
  • Removed SquashfsFileSource
  • Changed FilesystemWriter::push_*() functions to now return BackhandError to avoid duplicate files and invalid file paths. The following BackhandErrors were added to support this: DuplicatedFileName, UndefineFileName, and InvalidFilePath.
  • Changed FilesystemWriter::push_block_device<P: Into<PathBuf>>() into P: AsRef<Path>
  • Changed FilesystemWriter::push_block_device<P: Into<PathBuf>>() into P: 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, and FilesystemWriter:
-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 take BufReadSeek for an increase in performance during reading for some images.

Detailed Changed/Added/Removed

$ cargo public-api -ss diff v0.11.0..HEAD
Click 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 --kind for 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 --completions for the generation of shell completions scripts

Performance

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 our backhand/unsquashfs is 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.1 is 74.8MB, while our backhand/unsquashfs only uses 18.1MB.

## wcampbell0x2a/statusbar

### v0.3.4

Published: 2023-04-15 03:39:27 UTC | Tag: v0.3.4

### v0.3.3

Published: 2023-04-05 03:24:11 UTC | Tag: v0.3.3

### v0.3.2

Published: 2023-03-29 23:48:02 UTC | Tag: v0.3.2

## wcampbell0x2a/backhand

### v0.11.0

Published: 2023-03-15 03:49:46 UTC | Tag: v0.11.0

Added

  • Support for Read/Write of non-standard custom squashfs images:
    • LE_V4_0: (linux kernel) Little-Endian default official v4.0
    • BE_V4_0: Big-Endian v4.0
    • AVM_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: .compressor is now FilesystemCompressor, 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) for FilesystemWriter::write()
  • Update deku to 0.16.0
  • add: now reads file details to derive the details when the file is added the image
  • add: --mtime, --uid, --gid and --permission to override file details derived from file
  • unsquashfs: now correctly extracts ownership and permission details

Fixed

  • ID now supports multiple IDs for GUI and UID in the table
  • id_table is now properly a u64 pointer
  • Data is now not copied when during the use of a FilesystemWriter you decide to change the compression used. Thanks @rbran

Changed

  • Renamed SquashfsError to BackhandError

### v0.10.1

Published: 2023-02-23 04:26:46 UTC | Tag: v0.10.1

Added

  • Zstd compression support

Fixed

  • FilesystemWriter Debug impl now works
  • FilesystemReader::from_reader_with_offset(..) now properly respects given offsets
  • FilesystemWriter::write_with_offset(..) now properly respects given offsets

### v0.10.0

Published: 2023-02-21 03:46:40 UTC | Tag: v0.10.0

Added

  • 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 destination
  • replace: Add binary to replace file in squashfs filesystems
  • Add support for Lzo compression, and feature lzo

Fixed

  • 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 Compressor id values for Lzo and Lzma

Changed

  • Pass internal raw data by reference, improving only_read benchmarks by ~9%.
  • Invalid Superblock.block_size is now checked against MiB(1) instead of MB(1)

### v0.9.1

Published: 2023-02-16 14:46:26 UTC | Tag: v0.9.1

See CHANGELOG.

Fixed

  • Fix unsquashfs extracting wrong file data

### v0.9.0

Published: 2023-02-14 03:38:49 UTC | Tag: v0.9.0

See CHANGELOG.

Fixed

  • FilesystemWriter::push_file(..) correctly enters file into filesystem

Changed

  • Remove Result return type from FilesystemWriter::{push_file(..), push_dir(..), push_symlink(..), push_char_device(..) and push_block_devivce(..).
  • Remove unused errors: FieldNotInitialized and OsStringToStr.

### v0.8.1

Published: 2023-02-12 03:37:32 UTC | Tag: v0.8.1

See CHANGELOG

Release engineering is hard ;)

### v0.8.0

Published: 2023-02-12 03:23:57 UTC | Tag: v0.8.0

See CHANGELOG.

## wcampbell0x2a/zerus

### v0.4.0

Published: 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.0

Published: 2023-01-24 02:34:46 UTC | Tag: v0.7.0

### v0.6.0

Published: 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::Node to be a struct containing the path and InnerNode. 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.0

Published: 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(..) and Filesystem::from_reader_with_offset(..) which calls Squashfs::from_reader(..) and Squashfs::from_reader_with_offset(..) and Squashfs::into_filesystem(..).
  • 5% Performance increases due to using Vec::with_capacity(..) for fragment_bytes
  • Add Block and Char Device support for Reading and Writing
  • Fix error with inode_offset mis-calculation
  • Fix tail-end fragment support for reading image
  • Fix unsquashfs file path extraction

## wcampbell0x2a/statusbar

### v0.3.1

Published: 2022-12-30 21:37:23 UTC | Tag: v0.3.1

## wcampbell0x2a/zerus

### v0.3.0

Published: 2022-12-30 21:10:13 UTC | Tag: v0.3.0

## wcampbell0x2a/statusbar

### v0.3.0

Published: 2022-09-30 03:16:46 UTC | Tag: v0.3.0

### v0.2.0

Published: 2022-09-30 02:28:41 UTC | Tag: v0.2.0

### v0.1.1

Published: 2022-09-30 00:06:24 UTC | Tag: v0.1.1

### v0.1.0

Published: 2022-09-29 23:21:53 UTC | Tag: v0.1.0

## wcampbell0x2a/zerus

### v0.2.0

Published: 2022-08-07 15:17:48 UTC | Tag: v0.2.0

### v0.1.0

Published: 2022-07-28 03:12:56 UTC | Tag: v0.1.0