diff options
Diffstat (limited to 'src/main.rs')
-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") + } +} |