diff options
author | Ali MJ Al-Nasrawy <alimjalnasrawy@gmail.com> | 2021-04-05 20:21:34 +0000 |
---|---|---|
committer | Ali MJ Al-Nasrawy <alimjalnasrawy@gmail.com> | 2021-04-05 20:21:34 +0000 |
commit | 60695fac0957a4032ee84057de676ab8e3ddbb5d (patch) | |
tree | cdb58654c44c6c15ad8dcb2cfadc8e7b39d09047 /src/listing.rs | |
parent | Honor --no-symlinks option when listing (diff) | |
download | miniserve-60695fac0957a4032ee84057de676ab8e3ddbb5d.tar.gz miniserve-60695fac0957a4032ee84057de676ab8e3ddbb5d.zip |
Avoid unneccessary syscalls for entry metadata
For non-symlink files and directories, there is no need to call
`std::fs::metadata()` as the metadata are already obtained via
`entry.metadata()`
Diffstat (limited to 'src/listing.rs')
-rw-r--r-- | src/listing.rs | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/src/listing.rs b/src/listing.rs index 53d7233..9d74906 100644 --- a/src/listing.rs +++ b/src/listing.rs @@ -255,13 +255,16 @@ pub fn directory_listing( // show file url as relative to static path let file_url = utf8_percent_encode(&p.to_string_lossy(), FRAGMENT).to_string(); let file_name = entry.file_name().to_string_lossy().to_string(); - let is_symlink = match entry.metadata() { - Ok(metadata) => metadata.file_type().is_symlink(), - Err(_) => continue, + let (is_symlink, metadata) = match entry.metadata() { + Ok(metadata) if metadata.file_type().is_symlink() => { + // for symlinks, get the metadata of the original file + (true, std::fs::metadata(entry.path())) + } + res => (false, res), }; // if file is a directory, add '/' to the end of the name - if let Ok(metadata) = std::fs::metadata(entry.path()) { + if let Ok(metadata) = metadata { if skip_symlinks && is_symlink { continue; } |