diff options
author | Lars Wirzenius <liw@liw.fi> | 2018-10-01 21:00:26 +0300 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2018-10-01 21:00:26 +0300 |
commit | 6e9650e14d92bb114345553cabc5ba6ec5070193 (patch) | |
tree | 170044ac08d9040b67f8e3bfa4788b0921681521 /src | |
parent | 2ab889268425d11e8d04923576ded6477450d362 (diff) | |
download | summainrs-6e9650e14d92bb114345553cabc5ba6ec5070193.tar.gz |
Add: compute SHA256
Diffstat (limited to 'src')
-rw-r--r-- | src/main.rs | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/src/main.rs b/src/main.rs index 20499d8..cac0646 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,6 +3,7 @@ use std::io; use std::fs; use std::os::unix::fs::PermissionsExt; use std::os::linux::fs::MetadataExt; +use std::io::prelude::*; extern crate users; @@ -10,6 +11,11 @@ extern crate chrono; use chrono::prelude::DateTime; use chrono::{Utc}; +extern crate crypto_hash; +use crypto_hash::{Algorithm, Hasher}; + +extern crate hex; + mod fswalk; use fswalk::DirTree; @@ -38,7 +44,7 @@ fn write_info(path: &str, meta: &fs::Metadata) { println!("Username: {}", format_username(meta)); println!("Gid: {}", format_gid(meta)); println!("Group: {}", format_group(meta)); - println!("SHA256: xxx"); + println!("SHA256: {}", format_sha256(path)); println!(""); } @@ -102,3 +108,33 @@ fn format_group(meta: &fs::Metadata) -> String { format!("unknown group") } } + + +fn format_sha256(filename: &str) -> String { + let mut ok = true; + let mut hasher = Hasher::new(Algorithm::SHA256); + if let Ok(file) = fs::File::open(filename) { + let mut reader = io::BufReader::new(file); + let mut buf = [0; 1024 * 1024]; + let mut done = false; + while ok && !done{ + if let Ok(n) = reader.read(&mut buf) { + if n == 0 { + done = true; + } else if let Err(_) = hasher.write(&buf[0..n]) { + ok = false; + } + } else { + ok = false; + } + } + } else { + ok = false; + } + if ok { + let digest = hasher.finish(); + hex::encode(digest) + } else { + format!("can't read file") + } +} |