Err(err) => bail!("fstat {:?} failed - {}", self.full_path(), err),
};
- match match_filename(&filename, &stat, &local_match_pattern) {
+ match match_filename(&filename, &stat, &local_match_pattern)? {
(MatchType::Positive, _) => {
let filename_osstr = std::ffi::OsStr::from_bytes(filename.to_bytes());
eprintln!("matched by .pxarexclude entry - skipping: {:?}", self.full_path().join(filename_osstr));
filename: &CStr,
stat: &FileStat,
match_pattern: &Vec<MatchPattern>
-) -> (MatchType, Vec<MatchPattern>) {
+) -> Result<(MatchType, Vec<MatchPattern>), Error> {
let mut child_pattern = Vec::new();
let mut match_state = MatchType::None;
for pattern in match_pattern {
- match pattern.matches_filename(filename, is_directory(&stat)) {
+ match pattern.matches_filename(filename, is_directory(&stat))? {
MatchType::None => {},
MatchType::Positive => match_state = MatchType::Positive,
MatchType::Negative => match_state = MatchType::Negative,
}
}
- (match_state, child_pattern)
+ Ok((match_state, child_pattern))
}
fn errno_is_unsupported(errno: Errno) -> bool {
}
}
- pub fn matches_filename(&self, filename: &CStr, is_dir: bool) -> MatchType {
+ pub fn matches_filename(&self, filename: &CStr, is_dir: bool) -> Result<MatchType, Error> {
let mut res = MatchType::None;
let (front, _) = &self.split_pattern;
let filename_ptr = filename.as_ptr() as *const libc::c_char;
fnmatch(front_ptr, filename_ptr , 0)
};
- // TODO error cases
+ if fnmatch_res < 0 {
+ bail!("error in fnmatch inside of MatchPattern");
+ }
if fnmatch_res == 0 {
res = if self.match_positive {
MatchType::PartialPositive
let filename_ptr = filename.as_ptr() as *const libc::c_char;
fnmatch(full_ptr, filename_ptr, 0)
};
- // TODO error cases
+ if fnmatch_res < 0 {
+ bail!("error in fnmatch inside of MatchPattern");
+ }
if fnmatch_res == 0 {
res = if self.match_positive {
MatchType::Positive
res = MatchType::None;
}
- res
+ Ok(res)
}
}
// there are no match pattern.
let mut matched = parent_matched;
if match_pattern.len() > 0 {
- match match_filename(filename, entry.mode as u32 & libc::S_IFMT == libc::S_IFDIR, match_pattern) {
+ match match_filename(filename, entry.mode as u32 & libc::S_IFMT == libc::S_IFDIR, match_pattern)? {
(MatchType::None, _) => matched = MatchType::None,
(MatchType::Negative, _) => matched = MatchType::Negative,
(match_type, pattern) => {
filename: &OsStr,
is_dir: bool,
match_pattern: &Vec<MatchPattern>
-) -> (MatchType, Vec<MatchPattern>) {
+) -> Result<(MatchType, Vec<MatchPattern>), Error> {
let mut child_pattern = Vec::new();
let mut match_state = MatchType::None;
// read_filename() checks for nul bytes, so it is save to unwrap here
let name = CString::new(filename.as_bytes()).unwrap();
for pattern in match_pattern {
- match pattern.matches_filename(&name, is_dir) {
+ match pattern.matches_filename(&name, is_dir)? {
MatchType::None => {},
MatchType::Positive => {
match_state = MatchType::Positive;
}
}
- (match_state, child_pattern)
+ Ok((match_state, child_pattern))
}
fn file_openat(parent: RawFd, filename: &OsStr, flags: OFlag, mode: Mode) -> Result<std::fs::File, Error> {