30f653f7f4f151e1b38e28e92cd154ddb0617fac
Expose the LibreDrive profile catalog as a curated public API on `ld`: `ld::profiles()` returns the `Profiles` object (with `.get(drive_id)`) and `ld::profile(filter)` finds one — the catalog of supported drives, queried without unlocking. The unlock mechanism (firmware blobs, upload sequence, CDB wire format) stays private; `LibreDrive` is pub(crate), reached only via `all_unlockers()`. The unlock-handshake wire format the bdemu test-emulator needs to impersonate a drive (`UNLOCK_MARKER`, `is_unlock_read_buffer`) is behind a non-default `emulation` feature; the `cdb` module compiles only under it. Rename the `ScsiError` error variant to `Scsi` (matches css), gate the test-only `load_bundled` and `SCSI_STATUS_CHECK_CONDITION`. Clippy-clean in both feature configs; 86/89 tests pass.
freemkv-unlock
Unlocker plugins for libfreemkv.
libfreemkv ships only the pluggable Unlocker trait + registry and stays
firmware-clean — it contains no concrete unlock code. Each crate in this
workspace implements one unlocker and is registered into libfreemkv by a single
line in the consuming binary:
libfreemkv::register_unlocker(Box::new(my_unlocker::MyUnlocker::new()));
Removing an unlocker is deleting that one line and the dependency (delete-to-comply).
Members
Each member is a self-contained unlocker plugin — see its own README for details.
License: AGPL-3.0-only.
Languages
Rust
100%