summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2018-10-01 21:00:26 +0300
committerLars Wirzenius <liw@liw.fi>2018-10-01 21:00:26 +0300
commit6e9650e14d92bb114345553cabc5ba6ec5070193 (patch)
tree170044ac08d9040b67f8e3bfa4788b0921681521 /src
parent2ab889268425d11e8d04923576ded6477450d362 (diff)
downloadsummainrs-6e9650e14d92bb114345553cabc5ba6ec5070193.tar.gz
Add: compute SHA256
Diffstat (limited to 'src')
-rw-r--r--src/main.rs38
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")
+ }
+}