From e99a2b3ce14f29c547c48b810ea0a97158c90c47 Mon Sep 17 00:00:00 2001 From: Mikhail Gordeev Date: Thu, 1 Aug 2024 03:28:45 +0300 Subject: [PATCH] Add support for qcow2 qemu disks --- README.md | 1 + src/map.rs | 6 ++++++ src/matchers/app.rs | 6 ++++++ testdata/sample.qcow2 | Bin 0 -> 196640 bytes tests/app.rs | 8 ++++++++ 5 files changed, 21 insertions(+) create mode 100644 testdata/sample.qcow2 diff --git a/README.md b/README.md index cea0d80..5dfa2ac 100644 --- a/README.md +++ b/README.md @@ -215,6 +215,7 @@ assert_eq!(kind.extension(), "foo"); - **dey** - `application/vnd.android.dey` - **der** - `application/x-x509-ca-cert` - **obj** - `application/x-executable` +- **qcow2** - `application/x-qemu-disk` ## Known Issues diff --git a/src/map.rs b/src/map.rs index cd0b9ad..c9eb5e9 100644 --- a/src/map.rs +++ b/src/map.rs @@ -105,6 +105,12 @@ matcher_map!( "pem", matchers::app::is_pem ), + ( + MatcherType::App, + "application/x-qemu-disk", + "qcow2", + matchers::app::is_qcow2 + ), // Book ( MatcherType::Book, diff --git a/src/matchers/app.rs b/src/matchers/app.rs index d1b8101..55f8b65 100644 --- a/src/matchers/app.rs +++ b/src/matchers/app.rs @@ -157,3 +157,9 @@ pub fn is_pem(buf: &[u8]) -> bool { && buf[9] == b'N' && buf[10] == b' ' } + +/// Returns whether a buffer is a QCOW2 disk. +pub fn is_qcow2(buf: &[u8]) -> bool { + // https://github.com/qemu/qemu/blob/master/docs/interop/qcow2.txt + buf.len() > 4 && buf[0] == b'Q' && buf[1] == b'F' && buf[2] == b'I' && buf[3] == 0xFB +} diff --git a/testdata/sample.qcow2 b/testdata/sample.qcow2 new file mode 100644 index 0000000000000000000000000000000000000000..5c50046fba261c31bcfab4973c0c3d7b1903289e GIT binary patch literal 196640 zcmeIuOHRWu5CBjo?EyG~&%hy&kl3(d9hy``YLmz{g0kwdk=W1=RbkP9*!Cq#V$X~{ z@w>md{RkmUw$JzLYB$-OBGdiwSXJz2hxe)G+-SFUI3}Ma?++mqn-JXa!Ac;)%IP?>tVb)gz0You5RjhcO9E9 zr?y#*G$_KNdRxcT%xC>`m&Z!?yOd!ov#f?+3%`1nMXFxnk28<_jT8X_1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C7&Ipue;=%+75FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAaFSXML67-b7ChY zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U eAV7cs0RjXF5FkK+009C72oNAZfB=Di2z&y-3NYXR literal 0 HcmV?d00001 diff --git a/tests/app.rs b/tests/app.rs index 3f71b3b..ea77483 100644 --- a/tests/app.rs +++ b/tests/app.rs @@ -49,3 +49,11 @@ test_format!(App, "application/wasm", "wasm", wasm, "sample.wasm"); test_format!(App, "application/x-x509-ca-cert", "der", der, "sample.der"); test_format!(App, "application/x-x509-ca-cert", "pem", pem, "sample.pem"); + +test_format!( + App, + "application/x-qemu-disk", + "qcow2", + qcow2, + "sample.qcow2" +);