remove uevent test

This commit is contained in:
val213 2024-10-16 12:33:40 +08:00
parent b9f04fc3a4
commit 886504ff9b
7 changed files with 0 additions and 272 deletions

View File

@ -1,2 +0,0 @@
[build]
target = "x86_64-unknown-linux-musl"

View File

@ -1,3 +0,0 @@
/target
Cargo.lock
/install/

View File

@ -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"

View File

@ -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

View File

@ -1,4 +0,0 @@
# test_uevent
这是一个测试 uevent 机制的应用用于测试uevent的功能。
执行此测试,将会执行以下操作:

View File

@ -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);
}

View File

@ -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"
]
}