in integrations/fuse3/src/file_system.rs [104:139]
fn check_flags(&self, flags: u32) -> Result<(bool, bool, bool)> {
let is_trunc = flags & libc::O_TRUNC as u32 != 0 || flags & libc::O_CREAT as u32 != 0;
let is_append = flags & libc::O_APPEND as u32 != 0;
let mode = flags & libc::O_ACCMODE as u32;
let is_read = mode == libc::O_RDONLY as u32 || mode == libc::O_RDWR as u32;
let is_write = mode == libc::O_WRONLY as u32 || mode == libc::O_RDWR as u32 || is_append;
if !is_read && !is_write {
Err(Errno::from(libc::EINVAL))?;
}
// OpenDAL only supports truncate write and append write,
// so O_TRUNC or O_APPEND needs to be specified explicitly
if (is_write && !is_trunc && !is_append) || is_trunc && !is_write {
Err(Errno::from(libc::EINVAL))?;
}
let capability = self.op.info().full_capability();
if is_read && !capability.read {
Err(Errno::from(libc::EACCES))?;
}
if is_trunc && !capability.write {
Err(Errno::from(libc::EACCES))?;
}
if is_append && !capability.write_can_append {
Err(Errno::from(libc::EACCES))?;
}
log::trace!(
"check_flags: is_read={}, is_write={}, is_trunc={}, is_append={}",
is_read,
is_write,
is_trunc,
is_append
);
Ok((is_read, is_trunc, is_append))
}