From 1bc1d81a00d0207c9df26566f112bdd18b5bdcfc Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Thu, 17 Sep 2020 10:27:04 +0200 Subject: [PATCH] move compute_file_csum to src/tools.rs --- src/client/backup_reader.rs | 33 +++++---------------------------- src/client/pull.rs | 11 +++++++---- src/tools.rs | 31 ++++++++++++++++++++++++++++++- 3 files changed, 42 insertions(+), 33 deletions(-) diff --git a/src/client/backup_reader.rs b/src/client/backup_reader.rs index 5f002e22..8afaa4aa 100644 --- a/src/client/backup_reader.rs +++ b/src/client/backup_reader.rs @@ -1,5 +1,5 @@ use anyhow::{format_err, Error}; -use std::io::{Read, Write, Seek, SeekFrom}; +use std::io::{Write, Seek, SeekFrom}; use std::fs::File; use std::sync::Arc; use std::os::unix::fs::OpenOptionsExt; @@ -9,7 +9,10 @@ use serde_json::{json, Value}; use proxmox::tools::digest_to_hex; -use crate::backup::*; +use crate::{ + tools::compute_file_csum, + backup::*, +}; use super::{HttpClient, H2Client}; @@ -219,29 +222,3 @@ impl BackupReader { Ok(index) } } - -pub fn compute_file_csum(file: &mut File) -> Result<([u8; 32], u64), Error> { - - file.seek(SeekFrom::Start(0))?; - - let mut hasher = openssl::sha::Sha256::new(); - let mut buffer = proxmox::tools::vec::undefined(256*1024); - let mut size: u64 = 0; - - loop { - let count = match file.read(&mut buffer) { - Ok(count) => count, - Err(ref err) if err.kind() == std::io::ErrorKind::Interrupted => { continue; } - Err(err) => return Err(err.into()), - }; - if count == 0 { - break; - } - size += count as u64; - hasher.update(&buffer[..count]); - } - - let csum = hasher.finish(); - - Ok((csum, size)) -} diff --git a/src/client/pull.rs b/src/client/pull.rs index ab7e9891..bd4db59f 100644 --- a/src/client/pull.rs +++ b/src/client/pull.rs @@ -8,10 +8,13 @@ use std::collections::HashMap; use std::io::{Seek, SeekFrom}; use proxmox::api::error::{StatusCode, HttpError}; -use crate::server::{WorkerTask}; -use crate::backup::*; -use crate::api2::types::*; -use super::*; +use crate::{ + tools::compute_file_csum, + server::WorkerTask, + backup::*, + api2::types::*, + client::*, +}; // fixme: implement filters diff --git a/src/tools.rs b/src/tools.rs index 8080777d..f3ea44c9 100644 --- a/src/tools.rs +++ b/src/tools.rs @@ -5,7 +5,7 @@ use std::any::Any; use std::collections::HashMap; use std::hash::BuildHasher; use std::fs::File; -use std::io::{self, BufRead, ErrorKind, Read}; +use std::io::{self, BufRead, ErrorKind, Read, Seek, SeekFrom}; use std::os::unix::io::RawFd; use std::path::Path; @@ -563,3 +563,32 @@ pub fn strip_ascii_whitespace(line: &[u8]) -> &[u8] { None => &[], } } + +/// Seeks to start of file and computes the SHA256 hash +pub fn compute_file_csum(file: &mut File) -> Result<([u8; 32], u64), Error> { + + file.seek(SeekFrom::Start(0))?; + + let mut hasher = openssl::sha::Sha256::new(); + let mut buffer = proxmox::tools::vec::undefined(256*1024); + let mut size: u64 = 0; + + loop { + let count = match file.read(&mut buffer) { + Ok(count) => count, + Err(ref err) if err.kind() == std::io::ErrorKind::Interrupted => { + continue; + } + Err(err) => return Err(err.into()), + }; + if count == 0 { + break; + } + size += count as u64; + hasher.update(&buffer[..count]); + } + + let csum = hasher.finish(); + + Ok((csum, size)) +}