statx.rs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. use posix_types::stat::StatX;
  2. use crate::{
  3. kernel::{
  4. constants::{
  5. STATX_ATIME, STATX_BLOCKS, STATX_CTIME, STATX_GID, STATX_INO, STATX_MODE, STATX_MTIME,
  6. STATX_NLINK, STATX_SIZE, STATX_TYPE, STATX_UID,
  7. },
  8. vfs::types::Format,
  9. },
  10. prelude::KResult,
  11. };
  12. use super::{inode::InodeUse, Inode};
  13. impl<I> InodeUse<I>
  14. where
  15. I: Inode + ?Sized,
  16. {
  17. pub fn statx(&self, stat: &mut StatX, mask: u32) -> KResult<()> {
  18. let sb = self.sbget()?;
  19. let info = self.info().lock();
  20. if mask & STATX_NLINK != 0 {
  21. stat.stx_nlink = info.nlink as _;
  22. stat.stx_mask |= STATX_NLINK;
  23. }
  24. if mask & STATX_ATIME != 0 {
  25. stat.stx_atime = info.atime.into();
  26. stat.stx_mask |= STATX_ATIME;
  27. }
  28. if mask & STATX_MTIME != 0 {
  29. stat.stx_mtime = info.mtime.into();
  30. stat.stx_mask |= STATX_MTIME;
  31. }
  32. if mask & STATX_CTIME != 0 {
  33. stat.stx_ctime = info.ctime.into();
  34. stat.stx_mask |= STATX_CTIME;
  35. }
  36. if mask & STATX_SIZE != 0 {
  37. stat.stx_size = info.size as _;
  38. stat.stx_mask |= STATX_SIZE;
  39. }
  40. stat.stx_mode = 0;
  41. if mask & STATX_MODE != 0 {
  42. stat.stx_mode |= info.perm.bits() as u16;
  43. stat.stx_mask |= STATX_MODE;
  44. }
  45. if mask & STATX_TYPE != 0 {
  46. let format = self.format();
  47. stat.stx_mode |= format.as_raw() as u16;
  48. if let Format::BLK | Format::CHR = format {
  49. let devid = self.devid()?;
  50. stat.stx_rdev_major = devid.major as _;
  51. stat.stx_rdev_minor = devid.minor as _;
  52. }
  53. stat.stx_mask |= STATX_TYPE;
  54. }
  55. if mask & STATX_INO != 0 {
  56. stat.stx_ino = self.ino().as_raw();
  57. stat.stx_mask |= STATX_INO;
  58. }
  59. if mask & STATX_BLOCKS != 0 {
  60. stat.stx_blocks = (info.size + 512 - 1) / 512;
  61. stat.stx_blksize = sb.info.io_blksize as _;
  62. stat.stx_mask |= STATX_BLOCKS;
  63. }
  64. if mask & STATX_UID != 0 {
  65. stat.stx_uid = info.uid;
  66. stat.stx_mask |= STATX_UID;
  67. }
  68. if mask & STATX_GID != 0 {
  69. stat.stx_gid = info.gid;
  70. stat.stx_mask |= STATX_GID;
  71. }
  72. let fsdev = sb.info.device_id;
  73. stat.stx_dev_major = fsdev.major as _;
  74. stat.stx_dev_minor = fsdev.minor as _;
  75. // TODO: support more attributes
  76. stat.stx_attributes_mask = 0;
  77. Ok(())
  78. }
  79. }