[libos] faccessat only accepts three parameters

This commit is contained in:
Qi Zheng 2024-01-15 14:20:49 +08:00 committed by volcano
parent 47ac767886
commit beeffcced7
4 changed files with 12 additions and 22 deletions

@ -22,6 +22,7 @@ impl AccessibilityCheckMode {
} }
} }
#[allow(dead_code)]
bitflags! { bitflags! {
pub struct AccessibilityCheckFlags : u32 { pub struct AccessibilityCheckFlags : u32 {
/// If path is a symbolic link, do not dereference it /// If path is a symbolic link, do not dereference it
@ -31,31 +32,21 @@ bitflags! {
} }
} }
#[allow(dead_code)]
impl AccessibilityCheckFlags { impl AccessibilityCheckFlags {
pub fn from_u32(bits: u32) -> Result<Self> { pub fn from_u32(bits: u32) -> Result<Self> {
AccessibilityCheckFlags::from_bits(bits).ok_or_else(|| errno!(EINVAL, "invalid flags")) AccessibilityCheckFlags::from_bits(bits).ok_or_else(|| errno!(EINVAL, "invalid flags"))
} }
} }
pub fn do_faccessat( pub fn do_faccessat(fs_path: &FsPath, mode: AccessibilityCheckMode) -> Result<()> {
fs_path: &FsPath, debug!("faccessat: fs_path: {:?}, mode: {:?}", fs_path, mode);
mode: AccessibilityCheckMode,
flags: AccessibilityCheckFlags,
) -> Result<()> {
debug!(
"faccessat: fs_path: {:?}, mode: {:?}, flags: {:?}",
fs_path, mode, flags
);
let inode = { let inode = {
let path = fs_path.to_abs_path()?; let path = fs_path.to_abs_path()?;
let current = current!(); let current = current!();
let fs = current.fs().read().unwrap(); let fs = current.fs().read().unwrap();
if flags.contains(AccessibilityCheckFlags::AT_SYMLINK_NOFOLLOW) { fs.lookup_inode(&path)?
fs.lookup_inode_no_follow(&path)?
} else {
fs.lookup_inode(&path)?
}
}; };
if mode.test_for_exist() { if mode.test_for_exist() {
return Ok(()); return Ok(());

@ -1,7 +1,7 @@
use super::*; use super::*;
use process::Process; use process::Process;
pub use self::access::{do_faccessat, AccessibilityCheckFlags, AccessibilityCheckMode}; pub use self::access::{do_faccessat, AccessibilityCheckMode};
pub use self::chmod::{do_fchmod, do_fchmodat, FileMode}; pub use self::chmod::{do_fchmod, do_fchmodat, FileMode};
pub use self::chown::{do_fchown, do_fchownat, ChownFlags}; pub use self::chown::{do_fchown, do_fchownat, ChownFlags};
pub use self::close::do_close; pub use self::close::do_close;

@ -1,8 +1,8 @@
use super::event_file::EventCreationFlags; use super::event_file::EventCreationFlags;
use super::file_ops; use super::file_ops;
use super::file_ops::{ use super::file_ops::{
get_abs_path_by_fd, get_utimes, AccessibilityCheckFlags, AccessibilityCheckMode, ChownFlags, get_abs_path_by_fd, get_utimes, AccessibilityCheckMode, ChownFlags, FcntlCmd, FsPath,
FcntlCmd, FsPath, LinkFlags, StatFlags, UnlinkFlags, Utime, UtimeFlags, AT_FDCWD, UTIME_OMIT, LinkFlags, StatFlags, UnlinkFlags, Utime, UtimeFlags, AT_FDCWD, UTIME_OMIT,
}; };
use super::fs_ops; use super::fs_ops;
use super::fs_ops::{MountFlags, MountOptions, UmountFlags}; use super::fs_ops::{MountFlags, MountOptions, UmountFlags};
@ -304,17 +304,16 @@ pub fn do_fstatat(dirfd: i32, path: *const i8, stat_buf: *mut Stat, flags: u32)
} }
pub fn do_access(path: *const i8, mode: u32) -> Result<isize> { pub fn do_access(path: *const i8, mode: u32) -> Result<isize> {
self::do_faccessat(AT_FDCWD, path, mode, 0) self::do_faccessat(AT_FDCWD, path, mode)
} }
pub fn do_faccessat(dirfd: i32, path: *const i8, mode: u32, flags: u32) -> Result<isize> { pub fn do_faccessat(dirfd: i32, path: *const i8, mode: u32) -> Result<isize> {
let path = from_user::clone_cstring_safely(path)? let path = from_user::clone_cstring_safely(path)?
.to_string_lossy() .to_string_lossy()
.into_owned(); .into_owned();
let fs_path = FsPath::new(&path, dirfd, false)?; let fs_path = FsPath::new(&path, dirfd, false)?;
let mode = AccessibilityCheckMode::from_u32(mode)?; let mode = AccessibilityCheckMode::from_u32(mode)?;
let flags = AccessibilityCheckFlags::from_u32(flags)?; file_ops::do_faccessat(&fs_path, mode).map(|_| 0)
file_ops::do_faccessat(&fs_path, mode, flags).map(|_| 0)
} }
pub fn do_lseek(fd: FileDesc, offset: off_t, whence: i32) -> Result<isize> { pub fn do_lseek(fd: FileDesc, offset: off_t, whence: i32) -> Result<isize> {

@ -366,7 +366,7 @@ macro_rules! process_syscall_table_with_callback {
(Symlinkat = 266) => do_symlinkat(target: *const i8, new_dirfd: i32, link_path: *const i8), (Symlinkat = 266) => do_symlinkat(target: *const i8, new_dirfd: i32, link_path: *const i8),
(Readlinkat = 267) => do_readlinkat(dirfd: i32, path: *const i8, buf: *mut u8, size: usize), (Readlinkat = 267) => do_readlinkat(dirfd: i32, path: *const i8, buf: *mut u8, size: usize),
(Fchmodat = 268) => do_fchmodat(dirfd: i32, path: *const i8, mode: u16), (Fchmodat = 268) => do_fchmodat(dirfd: i32, path: *const i8, mode: u16),
(Faccessat = 269) => do_faccessat(dirfd: i32, path: *const i8, mode: u32, flags: u32), (Faccessat = 269) => do_faccessat(dirfd: i32, path: *const i8, mode: u32),
(Pselect6 = 270) => do_pselect6(nfds: c_int, readfds: *mut libc::fd_set, writefds: *mut libc::fd_set, exceptfds: *mut libc::fd_set, timeout: *mut timespec_t, data: *const sigset_argpack), (Pselect6 = 270) => do_pselect6(nfds: c_int, readfds: *mut libc::fd_set, writefds: *mut libc::fd_set, exceptfds: *mut libc::fd_set, timeout: *mut timespec_t, data: *const sigset_argpack),
(Ppoll = 271) => do_ppoll(fds: *mut libc::pollfd, nfds: libc::nfds_t, timeout_ts: *const timespec_t, sigmask: *const sigset_t), (Ppoll = 271) => do_ppoll(fds: *mut libc::pollfd, nfds: libc::nfds_t, timeout_ts: *const timespec_t, sigmask: *const sigset_t),
(Unshare = 272) => handle_unsupported(), (Unshare = 272) => handle_unsupported(),