move compute_file_csum to src/tools.rs

This commit is contained in:
Dietmar Maurer 2020-09-17 10:27:04 +02:00
parent dda72456d7
commit 1bc1d81a00
3 changed files with 42 additions and 33 deletions

View File

@ -1,5 +1,5 @@
use anyhow::{format_err, Error}; use anyhow::{format_err, Error};
use std::io::{Read, Write, Seek, SeekFrom}; use std::io::{Write, Seek, SeekFrom};
use std::fs::File; use std::fs::File;
use std::sync::Arc; use std::sync::Arc;
use std::os::unix::fs::OpenOptionsExt; use std::os::unix::fs::OpenOptionsExt;
@ -9,7 +9,10 @@ use serde_json::{json, Value};
use proxmox::tools::digest_to_hex; use proxmox::tools::digest_to_hex;
use crate::backup::*; use crate::{
tools::compute_file_csum,
backup::*,
};
use super::{HttpClient, H2Client}; use super::{HttpClient, H2Client};
@ -219,29 +222,3 @@ impl BackupReader {
Ok(index) 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))
}

View File

@ -8,10 +8,13 @@ use std::collections::HashMap;
use std::io::{Seek, SeekFrom}; use std::io::{Seek, SeekFrom};
use proxmox::api::error::{StatusCode, HttpError}; use proxmox::api::error::{StatusCode, HttpError};
use crate::server::{WorkerTask}; use crate::{
use crate::backup::*; tools::compute_file_csum,
use crate::api2::types::*; server::WorkerTask,
use super::*; backup::*,
api2::types::*,
client::*,
};
// fixme: implement filters // fixme: implement filters

View File

@ -5,7 +5,7 @@ use std::any::Any;
use std::collections::HashMap; use std::collections::HashMap;
use std::hash::BuildHasher; use std::hash::BuildHasher;
use std::fs::File; 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::os::unix::io::RawFd;
use std::path::Path; use std::path::Path;
@ -563,3 +563,32 @@ pub fn strip_ascii_whitespace(line: &[u8]) -> &[u8] {
None => &[], 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))
}