From 9d8ab627697c6d8aae81392ff954f42fdd2dbe88 Mon Sep 17 00:00:00 2001 From: Stefan Reiter Date: Thu, 22 Apr 2021 17:34:46 +0200 Subject: [PATCH] client-tools: add crypto_parameters_keep_fd same functionality as crypto_parameters, except it keeps the file descriptor passed as "keyfd" open (and seeks to the beginning after reading), if one is given. Signed-off-by: Stefan Reiter --- src/bin/proxmox_client_tools/key_source.rs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/bin/proxmox_client_tools/key_source.rs b/src/bin/proxmox_client_tools/key_source.rs index 0ad06bb0..fee00723 100644 --- a/src/bin/proxmox_client_tools/key_source.rs +++ b/src/bin/proxmox_client_tools/key_source.rs @@ -86,6 +86,14 @@ pub struct CryptoParams { } pub fn crypto_parameters(param: &Value) -> Result { + do_crypto_parameters(param, false) +} + +pub fn crypto_parameters_keep_fd(param: &Value) -> Result { + do_crypto_parameters(param, true) +} + +fn do_crypto_parameters(param: &Value, keep_keyfd_open: bool) -> Result { let keyfile = match param.get("keyfile") { Some(Value::String(keyfile)) => Some(keyfile), Some(_) => bail!("bad --keyfile parameter type"), @@ -135,11 +143,16 @@ pub fn crypto_parameters(param: &Value) -> Result { file_get_contents(keyfile)?, )), (None, Some(fd)) => { - let input = unsafe { std::fs::File::from_raw_fd(fd) }; + let mut input = unsafe { std::fs::File::from_raw_fd(fd) }; let mut data = Vec::new(); - let _len: usize = { input }.read_to_end(&mut data).map_err(|err| { + let _len: usize = input.read_to_end(&mut data).map_err(|err| { format_err!("error reading encryption key from fd {}: {}", fd, err) })?; + if keep_keyfd_open { + // don't close fd if requested, and try to reset seek position + std::mem::forget(input); + unsafe { libc::lseek(fd, 0, libc::SEEK_SET); } + } Some(KeyWithSource::from_fd(data)) } };