diff options
author | Lars Wirzenius <liw@liw.fi> | 2021-02-18 09:27:25 +0200 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2021-02-19 19:58:31 +0200 |
commit | 248e5ab7518746c0ac43747040290e9b5d138028 (patch) | |
tree | fead573f0f298758c913d01566de9edc682ebf22 /src/fsiter.rs | |
parent | 45f4145573035a6485f565cacf16c6a39c36dbd5 (diff) | |
download | obnam2-248e5ab7518746c0ac43747040290e9b5d138028.tar.gz |
feat: back up and restore Unix domain sockets
Diffstat (limited to 'src/fsiter.rs')
-rw-r--r-- | src/fsiter.rs | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/src/fsiter.rs b/src/fsiter.rs index 36693a6..f59fb64 100644 --- a/src/fsiter.rs +++ b/src/fsiter.rs @@ -1,7 +1,7 @@ use crate::fsentry::{FilesystemEntry, FsEntryError}; -use log::info; +use log::{debug, error}; use std::path::Path; -use walkdir::{IntoIter, WalkDir}; +use walkdir::{DirEntry, IntoIter, WalkDir}; /// Iterator over file system entries in a directory tree. pub struct FsIterator { @@ -14,6 +14,9 @@ pub enum FsIterError { WalkError(#[from] walkdir::Error), #[error(transparent)] + IoError(#[from] std::io::Error), + + #[error(transparent)] FsEntryError(#[from] FsEntryError), } @@ -30,19 +33,28 @@ impl FsIterator { impl Iterator for FsIterator { type Item = FsIterResult<FilesystemEntry>; fn next(&mut self) -> Option<Self::Item> { - match self.iter.next() { + let next = self.iter.next(); + debug!("walkdir found: {:?}", next); + match next { None => None, - Some(Ok(entry)) => { - info!("found {}", entry.path().display()); - Some(new_entry(&entry)) - } + Some(Ok(entry)) => Some(new_entry(&entry)), Some(Err(err)) => Some(Err(err.into())), } } } -fn new_entry(e: &walkdir::DirEntry) -> FsIterResult<FilesystemEntry> { - let meta = e.metadata()?; - let entry = FilesystemEntry::from_metadata(e.path(), &meta)?; +fn new_entry(e: &DirEntry) -> FsIterResult<FilesystemEntry> { + let path = e.path(); + let meta = std::fs::metadata(path); + debug!("metadata for {:?}: {:?}", path, meta); + let meta = match meta { + Ok(meta) => meta, + Err(err) => { + error!("failed to get metadata: {}", err); + return Err(err.into()); + } + }; + let entry = FilesystemEntry::from_metadata(path, &meta)?; + debug!("FileSystemEntry for {:?}: {:?}", path, entry); Ok(entry) } |