}
/// openat() wrapper which allows but logs `EACCES` and turns `ENOENT` into `None`.
+ ///
+ /// The `existed` flag is set when iterating through a directory to note that we know the file
+ /// is supposed to exist and we should warn if it doesnt'.
fn open_file(
&mut self,
parent: RawFd,
file_name: &CStr,
oflags: OFlag,
+ existed: bool,
) -> Result<Option<Fd>, Error> {
match Fd::openat(
&unsafe { RawFdNum::from_raw_fd(parent) },
Mode::empty(),
) {
Ok(fd) => Ok(Some(fd)),
- Err(nix::Error::Sys(Errno::ENOENT)) => Ok(None),
+ Err(nix::Error::Sys(Errno::ENOENT)) => {
+ if existed {
+ self.report_vanished_file()?;
+ }
+ Ok(None)
+ }
Err(nix::Error::Sys(Errno::EACCES)) => {
writeln!(self.errors, "failed to open file: {:?}: access denied", file_name)?;
Ok(None)
parent,
c_str!(".pxarexclude"),
OFlag::O_RDONLY | OFlag::O_CLOEXEC | OFlag::O_NOCTTY,
+ false,
)?;
let old_pattern_count = self.patterns.len();
parent,
c_file_name,
open_mode | OFlag::O_RDONLY | OFlag::O_NOFOLLOW | OFlag::O_CLOEXEC | OFlag::O_NOCTTY,
+ true,
)?;
let fd = match fd {
Some(fd) => fd,
- None => {
- self.report_vanished_file()?;
- return Ok(());
- }
+ None => return Ok(()),
};
let metadata = get_metadata(fd.as_raw_fd(), &stat, self.flags(), self.fs_magic)?;