main.rs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. use ext4_rs::{Ext4, InodeMode, OpenFlags, EXT4_ROOT_INO};
  2. use simple_logger::SimpleLogger;
  3. use std::sync::Arc;
  4. use block_file::BlockFile;
  5. mod block_file;
  6. const ROOT_INO: u32 = EXT4_ROOT_INO;
  7. fn make_ext4() {
  8. let _ = std::process::Command::new("rm")
  9. .args(["-rf", "ext4.img"])
  10. .status();
  11. let _ = std::process::Command::new("dd")
  12. .args(["if=/dev/zero", "of=ext4.img", "bs=1M", "count=512"])
  13. .status();
  14. let _ = std::process::Command::new("mkfs.ext4")
  15. .args(["ext4.img"])
  16. .output();
  17. }
  18. fn open_ext4() -> Ext4 {
  19. let file = BlockFile::new("ext4.img");
  20. println!("creating ext4");
  21. Ext4::load(Arc::new(file)).expect("open ext4 failed")
  22. }
  23. fn mkdir_test(ext4: &mut Ext4) {
  24. let dir_mode: InodeMode = InodeMode::DIRECTORY | InodeMode::ALL_RWX;
  25. ext4.generic_create(ROOT_INO, "d1", dir_mode)
  26. .expect("mkdir failed");
  27. ext4.generic_create(ROOT_INO, "d1/d2", dir_mode)
  28. .expect("mkdir failed");
  29. ext4.generic_create(ROOT_INO, "d1/d2/d3", dir_mode)
  30. .expect("mkdir failed");
  31. ext4.generic_create(ROOT_INO, "d1/d2/d3/d4", dir_mode)
  32. .expect("mkdir failed");
  33. ext4.generic_create(ROOT_INO, "d2", dir_mode)
  34. .expect("mkdir failed");
  35. ext4.generic_create(ROOT_INO, "d2/d3", dir_mode)
  36. .expect("mkdir failed");
  37. ext4.generic_create(ROOT_INO, "d2/d3/d4", dir_mode)
  38. .expect("mkdir failed");
  39. ext4.generic_create(ROOT_INO, "d3", dir_mode)
  40. .expect("mkdir failed");
  41. }
  42. fn create_test(ext4: &mut Ext4) {
  43. let file_mode: InodeMode = InodeMode::FILE | InodeMode::ALL_RWX;
  44. ext4.generic_create(ROOT_INO, "d1/d2/d3/d4/f1", file_mode)
  45. .expect("open failed");
  46. ext4.generic_create(ROOT_INO, "d3/f0", file_mode)
  47. .expect("open failed");
  48. ext4.generic_create(ROOT_INO, "d3/f1", file_mode)
  49. .expect("open failed");
  50. ext4.generic_create(ROOT_INO, "f1", file_mode)
  51. .expect("open failed");
  52. }
  53. fn read_write_test(ext4: &mut Ext4) {
  54. let wbuffer = "hello world".as_bytes();
  55. let wfile = ext4
  56. .generic_open(ROOT_INO, "d3/f0", OpenFlags::O_WRONLY)
  57. .expect("open failed");
  58. ext4.write(wfile.inode, 0, wbuffer).expect("write failed");
  59. let mut rbuffer = vec![0u8; wbuffer.len()];
  60. let rfile = ext4
  61. .generic_open(ROOT_INO, "d3/f0", OpenFlags::O_RDONLY)
  62. .expect("open failed");
  63. ext4.read(wfile.inode, 0, &mut rbuffer).expect("read failed");
  64. assert_eq!(wbuffer, rbuffer);
  65. }
  66. fn large_read_write_test(ext4: &mut Ext4) {
  67. let wbuffer = vec![99u8; 1024 * 1024 * 16];
  68. let wfile = ext4
  69. .generic_open(ROOT_INO, "d3/f1", OpenFlags::O_WRONLY)
  70. .expect("open failed");
  71. ext4.write(wfile.inode, 0, &wbuffer).expect("write failed");
  72. let rfile = ext4
  73. .generic_open(ROOT_INO, "d3/f1", OpenFlags::O_RDONLY)
  74. .expect("open failed");
  75. let mut rbuffer = vec![0u8; wbuffer.len()];
  76. ext4.read(rfile.inode, 0,&mut rbuffer).expect("read failed");
  77. assert_eq!(wbuffer, rbuffer);
  78. }
  79. fn remove_file_test(ext4: &mut Ext4) {
  80. ext4.generic_remove(ROOT_INO, "d3/f0")
  81. .expect("remove file failed");
  82. ext4.generic_lookup(ROOT_INO, "d3/f0")
  83. .expect_err("file not removed");
  84. ext4.generic_remove(ROOT_INO, "d3/f1")
  85. .expect("remove file failed");
  86. ext4.generic_lookup(ROOT_INO, "d3/f1")
  87. .expect_err("file not removed");
  88. ext4.generic_remove(ROOT_INO, "f1")
  89. .expect("remove file failed");
  90. ext4.generic_lookup(ROOT_INO, "f1")
  91. .expect_err("file not removed");
  92. ext4.generic_remove(ROOT_INO, "d1/not_exist")
  93. .expect_err("remove file failed");
  94. }
  95. fn remove_dir_test(ext4: &mut Ext4) {
  96. ext4.generic_remove(ROOT_INO, "d2")
  97. .expect_err("remove unempty dir");
  98. ext4.generic_create(ROOT_INO, "dtmp", InodeMode::DIRECTORY | InodeMode::ALL_RWX)
  99. .expect("mkdir failed");
  100. ext4.generic_lookup(ROOT_INO, "dtmp")
  101. .expect("dir not created");
  102. ext4.generic_remove(ROOT_INO, "dtmp")
  103. .expect("remove file failed");
  104. ext4.generic_lookup(ROOT_INO, "dtmp")
  105. .expect_err("dir not removed");
  106. }
  107. fn main() {
  108. SimpleLogger::new().init().unwrap();
  109. log::set_max_level(log::LevelFilter::Off);
  110. make_ext4();
  111. println!("ext4.img created");
  112. let mut ext4 = open_ext4();
  113. println!("ext4 opened");
  114. mkdir_test(&mut ext4);
  115. println!("mkdir test done");
  116. create_test(&mut ext4);
  117. println!("create test done");
  118. read_write_test(&mut ext4);
  119. println!("read write test done");
  120. large_read_write_test(&mut ext4);
  121. println!("large read write test done");
  122. remove_file_test(&mut ext4);
  123. println!("remove file test done");
  124. remove_dir_test(&mut ext4);
  125. println!("remove dir test done");
  126. }