open_utils.rs 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. use system_error::SystemError;
  2. use crate::{
  3. filesystem::vfs::{fcntl::AtFlags, file::FileMode, open::do_sys_open, MAX_PATHLEN},
  4. syscall::user_access::check_and_clone_cstr,
  5. };
  6. use super::ModeType;
  7. /// Performs the actual file opening operation.
  8. ///
  9. /// # Arguments
  10. /// * `path` - Pointer to the path string
  11. /// * `o_flags` - File opening flags
  12. /// * `mode` - File mode/permissions
  13. /// * `follow_symlink` - Whether to follow symbolic links
  14. ///
  15. /// # Returns
  16. /// File descriptor on success, or error code on failure.
  17. pub(super) fn do_open(
  18. path: *const u8,
  19. o_flags: u32,
  20. mode: u32,
  21. follow_symlink: bool,
  22. ) -> Result<usize, SystemError> {
  23. let path = check_and_clone_cstr(path, Some(MAX_PATHLEN))?
  24. .into_string()
  25. .map_err(|_| SystemError::EINVAL)?;
  26. let open_flags: FileMode = FileMode::from_bits(o_flags).ok_or(SystemError::EINVAL)?;
  27. let mode = ModeType::from_bits(mode).ok_or(SystemError::EINVAL)?;
  28. return do_sys_open(
  29. AtFlags::AT_FDCWD.bits(),
  30. &path,
  31. open_flags,
  32. mode,
  33. follow_symlink,
  34. );
  35. }