mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-27 03:43:23 +00:00
feat:添加symlink系统调用 (#984)
* 添加symlink系统调用 * 修改FATInode的dname的获取逻辑 * 修改fat对Dname的处理,分离dname和inode缓存的key --------- Co-authored-by: sparkzky <sparkhhhhhhhhh@outlook.com> Co-authored-by: longjin <longjin@DragonOS.org>
This commit is contained in:
78
user/apps/test-symlink/src/main.rs
Normal file
78
user/apps/test-symlink/src/main.rs
Normal file
@ -0,0 +1,78 @@
|
||||
extern crate libc;
|
||||
use core::ffi::{c_char, c_void};
|
||||
use libc::{mount, umount};
|
||||
use nix::errno::Errno;
|
||||
use std::fs;
|
||||
use std::os::unix::fs::symlink;
|
||||
use std::path::Path;
|
||||
|
||||
fn main() {
|
||||
mount_test_ramfs();
|
||||
|
||||
let target = "/mnt/myramfs/target_file.txt";
|
||||
let symlink_path = "/mnt/myramfs/another/symlink_file.txt";
|
||||
let dir = "/mnt/myramfs/another";
|
||||
|
||||
fs::write(target, "This is the content of the target file.")
|
||||
.expect("Failed to create target file");
|
||||
fs::create_dir(dir).expect("Failed to create target dir");
|
||||
|
||||
assert!(Path::new(target).exists(), "Target file was not created");
|
||||
assert!(Path::new(dir).exists(), "Target dir was not created");
|
||||
|
||||
symlink(target, symlink_path).expect("Failed to create symlink");
|
||||
|
||||
assert!(Path::new(symlink_path).exists(), "Symlink was not created");
|
||||
|
||||
let symlink_content = fs::read_link(symlink_path).expect("Failed to read symlink");
|
||||
assert_eq!(
|
||||
symlink_content.display().to_string(),
|
||||
target,
|
||||
"Symlink points to the wrong target"
|
||||
);
|
||||
|
||||
fs::remove_file(symlink_path).expect("Failed to remove symlink");
|
||||
fs::remove_file(target).expect("Failed to remove target file");
|
||||
fs::remove_dir(dir).expect("Failed to remove test_dir");
|
||||
|
||||
assert!(!Path::new(symlink_path).exists(), "Symlink was not deleted");
|
||||
assert!(!Path::new(target).exists(), "Target file was not deleted");
|
||||
assert!(!Path::new(dir).exists(), "Directory was not deleted");
|
||||
|
||||
umount_test_ramfs();
|
||||
|
||||
println!("All tests passed!");
|
||||
}
|
||||
|
||||
fn mount_test_ramfs() {
|
||||
let path = Path::new("mnt/myramfs");
|
||||
let dir = fs::create_dir_all(path);
|
||||
assert!(dir.is_ok(), "mkdir /mnt/myramfs failed");
|
||||
|
||||
let source = b"\0".as_ptr() as *const c_char;
|
||||
let target = b"/mnt/myramfs\0".as_ptr() as *const c_char;
|
||||
let fstype = b"ramfs\0".as_ptr() as *const c_char;
|
||||
// let flags = MS_BIND;
|
||||
let flags = 0;
|
||||
let data = std::ptr::null() as *const c_void;
|
||||
let result = unsafe { mount(source, target, fstype, flags, data) };
|
||||
|
||||
assert_eq!(
|
||||
result,
|
||||
0,
|
||||
"Mount myramfs failed, errno: {}",
|
||||
Errno::last().desc()
|
||||
);
|
||||
println!("Mount myramfs success!");
|
||||
}
|
||||
|
||||
fn umount_test_ramfs() {
|
||||
let path = b"/mnt/myramfs\0".as_ptr() as *const c_char;
|
||||
let result = unsafe { umount(path) };
|
||||
if result != 0 {
|
||||
let err = Errno::last();
|
||||
println!("Errno: {}", err);
|
||||
println!("Infomation: {}", err.desc());
|
||||
}
|
||||
assert_eq!(result, 0, "Umount myramfs failed");
|
||||
}
|
Reference in New Issue
Block a user