mirror of
https://github.com/freemkv/freemkv-unlock.git
synced 2026-10-07 18:13:11 +00:00
Add an additive, non-required coverage job to CI that runs cargo llvm-cov and uploads lcov to Codecov (tokenless, fail_ci_if_error false). Mirrors the test job's environment and pinned 1.90.0 toolchain; --locked is omitted to match this crate's gitignored-lockfile policy. Adds codecov.yml (informational, comment off) and a README badge.
38 lines
1.4 KiB
Markdown
38 lines
1.4 KiB
Markdown
# freemkv-unlock
|
|
|
|
[](https://codecov.io/gh/freemkv/freemkv-unlock)
|
|
|
|
The unlock layer for the freemkv toolchain.
|
|
|
|
An **unlocker removes a drive-level bus-encryption barrier** so the drive serves
|
|
readable (de-bus'd / de-scrambled) sectors. Content-key decryption is a separate
|
|
concern — the consumer's job.
|
|
|
|
This crate defines the `Unlocker` contract and a generic SCSI transport
|
|
contract, and holds the self-contained unlocker modules. The consumer
|
|
([libfreemkv](https://github.com/freemkv/libfreemkv)) depends on this crate and
|
|
dispatches through `all_unlockers()`; it never names an individual unlocker, and
|
|
clients of libfreemkv are oblivious to unlockers entirely (as they are to the
|
|
SCSI layer).
|
|
|
|
```rust
|
|
use freemkv_unlock::UnlockError;
|
|
|
|
// Drive-prep: try each unlocker's feature unlock until one claims the drive.
|
|
// `NotApplicable` means "not this unlocker's drive" — move on; a transport
|
|
// error means a dead bus — abort. `unlock_bus` follows the same contract for
|
|
// removing per-disc bus encryption.
|
|
for u in freemkv_unlock::all_unlockers() {
|
|
match u.unlock_features(&mut scsi, &ctx) {
|
|
Ok(unlocked) => return Ok(unlocked),
|
|
Err(UnlockError::NotApplicable) => continue,
|
|
Err(e) => return Err(e),
|
|
}
|
|
}
|
|
```
|
|
|
|
To remove an unlocker, delete its module directory and its one line in
|
|
`all_unlockers()` — nothing else changes.
|
|
|
|
License: MIT.
|