mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-08 18:26:48 +00:00
remove uevent test
This commit is contained in:
parent
b9f04fc3a4
commit
886504ff9b
@ -1,2 +0,0 @@
|
||||
[build]
|
||||
target = "x86_64-unknown-linux-musl"
|
3
user/apps/test-uevent/.gitignore
vendored
3
user/apps/test-uevent/.gitignore
vendored
@ -1,3 +0,0 @@
|
||||
/target
|
||||
Cargo.lock
|
||||
/install/
|
@ -1,12 +0,0 @@
|
||||
[package]
|
||||
name = "test-uevent"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
description = "test for uevent"
|
||||
authors = [ "val213 <val213666@gmail.com>" ]
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
netlink-sys = "0.5"
|
||||
nix = "0.24"
|
@ -1,56 +0,0 @@
|
||||
TOOLCHAIN="+nightly-2023-08-15-x86_64-unknown-linux-gnu"
|
||||
RUSTFLAGS+=""
|
||||
|
||||
ifdef DADK_CURRENT_BUILD_DIR
|
||||
# 如果是在dadk中编译,那么安装到dadk的安装目录中
|
||||
INSTALL_DIR = $(DADK_CURRENT_BUILD_DIR)
|
||||
else
|
||||
# 如果是在本地编译,那么安装到当前目录下的install目录中
|
||||
INSTALL_DIR = ./install
|
||||
endif
|
||||
|
||||
ifeq ($(ARCH), x86_64)
|
||||
export RUST_TARGET=x86_64-unknown-linux-musl
|
||||
else ifeq ($(ARCH), riscv64)
|
||||
export RUST_TARGET=riscv64gc-unknown-linux-gnu
|
||||
else
|
||||
# 默认为x86_86,用于本地编译
|
||||
export RUST_TARGET=x86_64-unknown-linux-musl
|
||||
endif
|
||||
|
||||
run:
|
||||
RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) run --target $(RUST_TARGET)
|
||||
|
||||
build:
|
||||
RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) build --target $(RUST_TARGET)
|
||||
|
||||
clean:
|
||||
RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) clean --target $(RUST_TARGET)
|
||||
|
||||
test:
|
||||
RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) test --target $(RUST_TARGET)
|
||||
|
||||
doc:
|
||||
RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) doc --target $(RUST_TARGET)
|
||||
|
||||
fmt:
|
||||
RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) fmt
|
||||
|
||||
fmt-check:
|
||||
RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) fmt --check
|
||||
|
||||
run-release:
|
||||
RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) run --target $(RUST_TARGET) --release
|
||||
|
||||
build-release:
|
||||
RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) build --target $(RUST_TARGET) --release
|
||||
|
||||
clean-release:
|
||||
RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) clean --target $(RUST_TARGET) --release
|
||||
|
||||
test-release:
|
||||
RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) test --target $(RUST_TARGET) --release
|
||||
|
||||
.PHONY: install
|
||||
install:
|
||||
RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) install --target $(RUST_TARGET) --path . --no-track --root $(INSTALL_DIR) --force
|
@ -1,4 +0,0 @@
|
||||
# test_uevent
|
||||
这是一个测试 uevent 机制的应用,用于测试uevent的功能。
|
||||
|
||||
执行此测试,将会执行以下操作:
|
@ -1,166 +0,0 @@
|
||||
use libc::{sockaddr, recvfrom, bind, sendto, socket, AF_NETLINK, SOCK_DGRAM, getpid, c_void};
|
||||
use nix::libc;
|
||||
use std::os::unix::io::RawFd;
|
||||
use std::{io, mem};
|
||||
|
||||
#[repr(C)]
|
||||
struct Nlmsghdr {
|
||||
nlmsg_len: u32,
|
||||
nlmsg_type: u16,
|
||||
nlmsg_flags: u16,
|
||||
nlmsg_seq: u32,
|
||||
nlmsg_pid: u32,
|
||||
}
|
||||
|
||||
fn create_netlink_socket() -> io::Result<RawFd> {
|
||||
let sockfd = unsafe {
|
||||
socket(AF_NETLINK, SOCK_DGRAM, libc::NETLINK_KOBJECT_UEVENT)
|
||||
};
|
||||
|
||||
if sockfd < 0 {
|
||||
println!("Error: {}", io::Error::last_os_error());
|
||||
return Err(io::Error::last_os_error());
|
||||
}
|
||||
|
||||
Ok(sockfd)
|
||||
}
|
||||
|
||||
fn bind_netlink_socket(sock: RawFd) -> io::Result<()> {
|
||||
let pid = unsafe { getpid() };
|
||||
let mut addr: libc::sockaddr_nl = unsafe { mem::zeroed() };
|
||||
addr.nl_family = AF_NETLINK as u16;
|
||||
addr.nl_pid = pid as u32;
|
||||
addr.nl_groups = 1;
|
||||
|
||||
let ret = unsafe {
|
||||
bind(
|
||||
sock,
|
||||
&addr as *const _ as *const sockaddr,
|
||||
mem::size_of::<libc::sockaddr_nl>() as u32,
|
||||
)
|
||||
};
|
||||
|
||||
if ret < 0 {
|
||||
println!("Error: {}", io::Error::last_os_error());
|
||||
return Err(io::Error::last_os_error());
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn send_uevent(sock: RawFd, message: &str) -> io::Result<()> {
|
||||
let mut addr: libc::sockaddr_nl = unsafe { mem::zeroed() };
|
||||
addr.nl_family = AF_NETLINK as u16;
|
||||
addr.nl_pid = 0;
|
||||
addr.nl_groups = 0;
|
||||
|
||||
let nlmsghdr = Nlmsghdr {
|
||||
nlmsg_len: (mem::size_of::<Nlmsghdr>() + message.len()) as u32,
|
||||
nlmsg_type: 0,
|
||||
nlmsg_flags: 0,
|
||||
nlmsg_seq: 0,
|
||||
nlmsg_pid: 0,
|
||||
};
|
||||
|
||||
let mut buffer = Vec::with_capacity(nlmsghdr.nlmsg_len as usize);
|
||||
buffer.extend_from_slice(unsafe {
|
||||
std::slice::from_raw_parts(
|
||||
&nlmsghdr as *const Nlmsghdr as *const u8,
|
||||
mem::size_of::<Nlmsghdr>(),
|
||||
)
|
||||
});
|
||||
buffer.extend_from_slice(message.as_bytes());
|
||||
|
||||
let ret = unsafe {
|
||||
sendto(
|
||||
sock,
|
||||
buffer.as_ptr() as *const c_void,
|
||||
buffer.len(),
|
||||
0,
|
||||
&addr as *const _ as *const sockaddr,
|
||||
mem::size_of::<libc::sockaddr_nl>() as u32,
|
||||
)
|
||||
};
|
||||
|
||||
if ret < 0 {
|
||||
println!("Error: {}", io::Error::last_os_error());
|
||||
return Err(io::Error::last_os_error());
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn receive_uevent(sock: RawFd) -> io::Result<String> {
|
||||
// 检查套接字文件描述符是否有效
|
||||
if sock < 0 {
|
||||
println!("Invalid socket file descriptor: {}", sock);
|
||||
return Err(io::Error::new(
|
||||
io::ErrorKind::InvalidInput,
|
||||
"Invalid socket file descriptor",
|
||||
));
|
||||
}
|
||||
|
||||
let mut buf = [0u8; 1024];
|
||||
// let mut addr: sockaddr_storage = unsafe { mem::zeroed() };
|
||||
// let mut addr_len = mem::size_of::<sockaddr_storage>() as u32;
|
||||
|
||||
// 检查缓冲区指针和长度是否有效
|
||||
if buf.is_empty() {
|
||||
println!("Buffer is empty");
|
||||
return Err(io::Error::new(
|
||||
io::ErrorKind::InvalidInput,
|
||||
"Buffer is empty",
|
||||
));
|
||||
}
|
||||
let len = unsafe {
|
||||
recvfrom(
|
||||
sock,
|
||||
buf.as_mut_ptr() as *mut c_void,
|
||||
buf.len(),
|
||||
0,
|
||||
core::ptr::null_mut(), // 不接收发送方地址
|
||||
core::ptr::null_mut(), // 不接收发送方地址长度
|
||||
)
|
||||
};
|
||||
println!("Received {} bytes", len);
|
||||
println!("Received message: {:?}", &buf[..len as usize]);
|
||||
if len < 0 {
|
||||
println!("Error: {}", io::Error::last_os_error());
|
||||
return Err(io::Error::last_os_error());
|
||||
}
|
||||
|
||||
let nlmsghdr_size = mem::size_of::<Nlmsghdr>();
|
||||
if (len as usize) < nlmsghdr_size {
|
||||
println!("Received message is too short");
|
||||
return Err(io::Error::new(
|
||||
io::ErrorKind::InvalidData,
|
||||
"Received message is too short",
|
||||
));
|
||||
}
|
||||
|
||||
let nlmsghdr = unsafe { &*(buf.as_ptr() as *const Nlmsghdr) };
|
||||
if nlmsghdr.nlmsg_len as isize > len {
|
||||
println!("Received message is incomplete");
|
||||
return Err(io::Error::new(
|
||||
io::ErrorKind::InvalidData,
|
||||
"Received message is incomplete",
|
||||
));
|
||||
}
|
||||
|
||||
let message_data = &buf[nlmsghdr_size..nlmsghdr.nlmsg_len as usize];
|
||||
Ok(String::from_utf8_lossy(message_data).to_string())
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let socket = create_netlink_socket().expect("Failed to create Netlink socket");
|
||||
println!("Netlink socket created successfully");
|
||||
|
||||
bind_netlink_socket(socket).expect("Failed to bind Netlink socket");
|
||||
println!("Netlink socket created and bound successfully");
|
||||
|
||||
send_uevent(socket, "add@/devices/virtual/block/loop0").expect("Failed to send uevent message");
|
||||
println!("Custom uevent message sent successfully");
|
||||
|
||||
let message = receive_uevent(socket).expect("Failed to receive uevent message");
|
||||
println!("Received uevent message: {}", message);
|
||||
}
|
@ -1,29 +0,0 @@
|
||||
{
|
||||
"name": "test-uevent",
|
||||
"version": "0.1.0",
|
||||
"description": "",
|
||||
"rust_target": null,
|
||||
"task_type": {
|
||||
"BuildFromSource": {
|
||||
"Local": {
|
||||
"path": "apps/test-uevent"
|
||||
}
|
||||
}
|
||||
},
|
||||
"depends": [],
|
||||
"build": {
|
||||
"build_command": "make install"
|
||||
},
|
||||
"install": {
|
||||
"in_dragonos_path": "/"
|
||||
},
|
||||
"clean": {
|
||||
"clean_command": "make clean"
|
||||
},
|
||||
"envs": [],
|
||||
"build_once": false,
|
||||
"install_once": false,
|
||||
"target_arch": [
|
||||
"x86_64"
|
||||
]
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user