From fb431a9bab7f6642df50af4e37c4b89eea17b98e Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Tue, 2 Oct 2018 10:01:11 +0300 Subject: Change: move formatting to its own module --- src/main.rs | 155 ++++++++++-------------------------------------------------- 1 file changed, 26 insertions(+), 129 deletions(-) diff --git a/src/main.rs b/src/main.rs index 7412799..925f300 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,152 +1,49 @@ use std::env; use std::io; -use std::fs; -use std::os::unix::fs::PermissionsExt; -use std::os::linux::fs::MetadataExt; -use std::io::prelude::*; extern crate walkdir; use walkdir::{WalkDir, DirEntry}; -extern crate users; - extern crate chrono; -use chrono::prelude::DateTime; -use chrono::{Utc}; - extern crate crypto_hash; -use crypto_hash::{Algorithm, Hasher}; -extern crate hex; +mod format; + fn main() -> io::Result<()> { for dirname in env::args().skip(1) { for e in WalkDir::new(&dirname).into_iter().filter_map(|e| e.ok()) { - write_info(&e); + println!("{}", format_rfc822(&e)); } } Ok(()) } -fn write_info(e: &DirEntry) { - println!("Name: {}", format_name(e)); - println!("Mtime: {}", format_mtime(e)); - println!("Mode: {}", format_mode(e)); - println!("Ino: {}", format_inode(e)); - println!("Dev: {}", format_dev(e)); - println!("Nlink: {}", format_nlink(e)); - println!("Size: {}", format_size(e)); - println!("Uid: {}", format_uid(e)); - println!("Username: {}", format_username(e)); - println!("Gid: {}", format_gid(e)); - println!("Group: {}", format_group(e)); - println!("SHA256: {}", format_sha256(e)); - println!(""); -} - - -fn format_name(e: &DirEntry) -> String { - e.path().to_string_lossy().to_string() -} - - -fn format_mtime(e: &DirEntry) -> String { - let meta = e.metadata().unwrap(); - let mtime = meta.modified().unwrap(); - let datetime = DateTime::::from(mtime); - datetime.format("%Y-%m-%d %H:%M:%S.%f %z").to_string() -} - - -fn format_mode(e: &DirEntry) -> String { - let meta = e.metadata().unwrap(); - let mode = meta.permissions().mode(); - format!("{:06o}", mode) -} - - -fn format_inode(e: &DirEntry) -> String { - let meta = e.metadata().unwrap(); - format!("{}", meta.st_ino()) -} - - -fn format_dev(e: &DirEntry) -> String { - let meta = e.metadata().unwrap(); - format!("{}", meta.st_dev()) -} - - -fn format_nlink(e: &DirEntry) -> String { - let meta = e.metadata().unwrap(); - format!("{}", meta.st_nlink()) -} - - -fn format_size(e: &DirEntry) -> String { - let meta = e.metadata().unwrap(); - format!("{}", meta.len()) -} - - -fn format_uid(e: &DirEntry) -> String { - let meta = e.metadata().unwrap(); - format!("{}", meta.st_uid()) -} - - -fn format_gid(e: &DirEntry) -> String { - let meta = e.metadata().unwrap(); - format!("{}", meta.st_gid()) -} - - -fn format_username(e: &DirEntry) -> String { - let meta = e.metadata().unwrap(); - if let Some(u) = users::get_user_by_uid(meta.st_uid()) { - format!("{}", u.name()) - } else { - format!("unknown user") - } -} - - -fn format_group(e: &DirEntry) -> String { - let meta = e.metadata().unwrap(); - if let Some(g) = users::get_group_by_gid(meta.st_gid()) { - format!("{}", g.name()) - } else { - format!("unknown group") - } -} - - -fn format_sha256(e: &DirEntry) -> String { - let mut ok = true; - let mut hasher = Hasher::new(Algorithm::SHA256); - if let Ok(file) = fs::File::open(e.path()) { - 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; - } +fn format_rfc822(e: &DirEntry) -> String { + let mut s = String::new(); + let mut fields = vec![ + ("Name", format::name(e)), + ("Mtime", format::mtime(e)), + ("Mode", format::mode(e)), + ("Ino", format::inode(e)), + ("Dev", format::dev(e)), + ("Nlink", format::nlink(e)), + ("Size", format::size(e)), + ("Uid", format::uid(e)), + ("Username", format::username(e)), + ("Gid", format::gid(e)), + ("Group", format::group(e)), + ]; + + if let Ok(m) = e.metadata() { + if m.is_file() { + fields.push(("SHA256", format::sha256(e))) } - } else { - ok = false; } - if ok { - let digest = hasher.finish(); - hex::encode(digest) - } else { - format!("can't read file") + + for (name, value) in fields.iter() { + s.push_str(&format!("{}: {}\n", name, value)); } + s } -- cgit v1.2.1