Skip to content

Commit 0c060d1

Browse files
committed
refactor: put hermit-image-reader into this repo, for now
1 parent 582c866 commit 0c060d1

File tree

10 files changed

+505
-4
lines changed

10 files changed

+505
-4
lines changed

Cargo.lock

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
[workspace]
2+
members = ["hermit-image-reader", "uhyve-interface"]
23
exclude = ["tests/test-kernels", "hermit-rs", "hermit-rs/*", "kernel"]
34

45
[package]
@@ -51,6 +52,7 @@ env_logger = "0.11"
5152
gdbstub = "0.7"
5253
gdbstub_arch = "0.3"
5354
hermit-entry = { version = "0.10.4", features = ["loader"] }
55+
hermit-image-reader = { version = "0.1", path = "hermit-image-reader" }
5456
libc = "0.2"
5557
log = "0.4"
5658
mac_address = "1.1"
@@ -73,9 +75,6 @@ serde = { version = "1.0", features = ["derive"] }
7375
merge = { version = "0.2" }
7476
memmap2 = "0.9.8"
7577

76-
[dependencies.hermit-image-reader]
77-
git = "https://codeberg.org/hermit-os-contrib/hermit-image-reader.git"
78-
7978
[target.'cfg(target_os = "linux")'.dependencies]
8079
kvm-bindings = "0.14"
8180
kvm-ioctls = "0.24"

hermit-image-reader/Cargo.lock

Lines changed: 203 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

hermit-image-reader/Cargo.toml

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
[package]
2+
name = "hermit-image-reader"
3+
version = "0.1.0"
4+
edition = "2024"
5+
license = "MIT OR Apache-2.0"
6+
7+
[features]
8+
std = ["compression/std"]
9+
10+
[dependencies]
11+
12+
[dependencies.byte-unit]
13+
version = "5"
14+
default-features = false
15+
features = ["byte", "serde"]
16+
17+
[dependencies.compression]
18+
version = "0.1"
19+
default-features = false
20+
features = ["gzip"]
21+
22+
[dependencies.num-traits]
23+
version = "0.2"
24+
default-features = false
25+
26+
[dependencies.serde]
27+
version = "1"
28+
default-features = false
29+
features = ["alloc", "derive"]
30+
31+
[dependencies.toml]
32+
version = "0.9"
33+
default-features = false
34+
features = ["parse", "serde"]

hermit-image-reader/LICENSE-APACHE

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../LICENSE-APACHE

hermit-image-reader/LICENSE-MIT

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../LICENSE-MIT
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// Copyright (c) 2025 Hermit contributors
2+
// SPDX-License-Identifier: MIT OR Apache-2.0
3+
4+
fn main() {
5+
for f in std::env::args().skip(1) {
6+
println!("# File {}:", f);
7+
let data = std::fs::read(f).expect("unable to read image file");
8+
let decompressed = hermit_image_reader::decompress_image(&data[..])
9+
.expect("unable to decompress image file");
10+
for i in hermit_image_reader::ImageParser::new(&decompressed[..]) {
11+
let i = i.expect("unable to read image entry");
12+
print!(" Entry ");
13+
if let Ok(name) = str::from_utf8(&*i.name) {
14+
print!("{:?}", name);
15+
} else {
16+
print!("{:?}", i.name);
17+
}
18+
if i.is_exec {
19+
print!(" (executable)");
20+
}
21+
print!(" :: {:?} :: starts with: ", i.value_range);
22+
let value_start = &i.value[..core::cmp::min(20, i.value.len())];
23+
24+
if let Ok(value_start) = str::from_utf8(value_start) {
25+
println!("{:?}", value_start);
26+
} else {
27+
println!("{:?}", value_start);
28+
}
29+
30+
if let Ok(name) = str::from_utf8(&*i.name) {
31+
if name == hermit_image_reader::config::DEFAULT_CONFIG_NAME {
32+
match hermit_image_reader::config::parse(i.value) {
33+
Ok(config) => println!("parsed config ::\n{:#?}\n", config),
34+
Err(e) => eprintln!("failed to parse config :: {}", e),
35+
}
36+
}
37+
}
38+
}
39+
}
40+
}

hermit-image-reader/src/config.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// Copyright (c) 2025 Hermit contributors
2+
// SPDX-License-Identifier: MIT OR Apache-2.0
3+
4+
use alloc::{collections::btree_map as btm, string::String, vec::Vec};
5+
6+
pub const DEFAULT_CONFIG_NAME: &'static str = "hermit_config.toml";
7+
pub type ParserError = toml::de::Error;
8+
9+
#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)]
10+
/// The image `hermit_config.toml` config file format.
11+
///
12+
/// All file paths are relative to the iamge root.
13+
pub struct Config {
14+
pub input: Input,
15+
pub requirements: Requirements,
16+
17+
pub kernel: String,
18+
pub file_mapping: btm::BTreeMap<String, String>,
19+
}
20+
21+
#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)]
22+
pub struct Input {
23+
/// Arguments to be passed to the kernel
24+
pub kernel_args: Vec<String>,
25+
26+
/// Arguments to be passed to the application
27+
pub app_args: Vec<String>,
28+
29+
/// Environment variables
30+
pub env_vars: Vec<String>,
31+
}
32+
33+
#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)]
34+
pub struct Requirements {
35+
pub memory: Option<byte_unit::Byte>,
36+
37+
#[serde(default)]
38+
pub cpus: u32,
39+
}
40+
41+
#[inline]
42+
pub fn parse(data: &[u8]) -> Result<Config, ParserError> {
43+
toml::from_slice(data)
44+
}

hermit-image-reader/src/lib.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Copyright (c) 2025 Hermit contributors
2+
// SPDX-License-Identifier: MIT OR Apache-2.0
3+
4+
#![no_std]
5+
6+
extern crate alloc;
7+
8+
use alloc::vec::Vec;
9+
10+
/// We assume that all images are gzip-compressed
11+
pub fn decompress_image(data: &[u8]) -> Result<Vec<u8>, compression::prelude::CompressionError> {
12+
use compression::prelude::{DecodeExt as _, GZipDecoder};
13+
14+
data.iter()
15+
.copied()
16+
.decode(&mut GZipDecoder::new())
17+
.collect()
18+
}
19+
20+
mod tar_parser;
21+
pub use tar_parser::{ImageFile, ImageParser, ImageParserError};
22+
23+
pub mod config;

0 commit comments

Comments
 (0)