diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2022-12-16 18:47:47 +0100 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2022-12-16 18:47:47 +0100 |
commit | 56511932154a1378bb7de88dcc1771fc2246c24c (patch) | |
tree | 9b27eb8225d479a91083a0a06b4210af47e2463e | |
parent | 52d1a15d8bd3a863947357eb655fc8e7e01122b4 (diff) |
support creation of image files
-rw-r--r-- | src/main.rs | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/src/main.rs b/src/main.rs index 10a3deb..085d9df 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,14 +2,20 @@ use anyhow::bail; use clap::Parser; use std::fs::File; use std::io::Write; +use std::os::unix::fs::PermissionsExt; use std::os::unix::io::AsRawFd; +const MODE_DEVICE: u32 = 1 << 14; + #[derive(Debug, Parser)] #[command(author = "The Rustkrazy Authors", version = "v0.1.0", about = "Generate a rustkrazy image.", long_about = None)] struct Args { /// Output location of a full image. #[arg(short = 'o', long = "overwrite")] overwrite: String, + /// Size of image file. Used if --overwrite is a file. + #[arg(short = 'n', long = "size")] + size: Option<u64>, } #[cfg(target_os = "linux")] @@ -86,21 +92,34 @@ fn partition(file: &mut std::fs::File, dev_size: u64) -> anyhow::Result<()> { Ok(()) } -fn partition_device(overwrite: String) -> anyhow::Result<()> { - let mut file = File::create(overwrite.clone())?; - - let dev_size = device_size(&file, overwrite)?; +fn partition_device(file: &mut std::fs::File, overwrite: String) -> anyhow::Result<()> { + let dev_size = device_size(file, overwrite)?; println!("Destination holds {} bytes", dev_size); - partition(&mut file, dev_size)?; + partition(file, dev_size)?; Ok(()) } +fn overwrite_device(file: &mut std::fs::File, overwrite: String) -> anyhow::Result<()> { + partition_device(file, overwrite) +} + +fn overwrite_file(file: &mut std::fs::File, file_size: u64) -> anyhow::Result<()> { + partition(file, file_size) +} + fn main() -> anyhow::Result<()> { let args = Args::parse(); - partition_device(args.overwrite)?; + let mut file = File::create(args.overwrite.clone())?; - Ok(()) + if file.metadata()?.permissions().mode() & MODE_DEVICE != 0 { + overwrite_device(&mut file, args.overwrite) + } else { + match args.size { + Some(v) => overwrite_file(&mut file, v), + None => bail!("Files require --size to be specified"), + } + } } |