userspace/types/string/
terminate.rs

1use crate::target::os::syscall;
2pub fn terminate(head: &str) -> *const u8 {
3    let tailed = match syscall::mmap(
4        core::ptr::null_mut(),
5        head.bytes().len() + 1,
6        (syscall::mmap::Prot::Read | syscall::mmap::Prot::Write) as i32,
7        (syscall::mmap::Flag::Anonymous | syscall::mmap::Flag::Private) as i32,
8        -1,
9        0,
10    ) {
11        Ok(crate::Ok::Target(crate::target::Ok::Os(crate::target::os::Ok::Syscall(
12            crate::target::os::syscall::Ok::MMap(crate::target::os::syscall::mmap::Ok::Default(m)),
13        )))) => m,
14        _ => panic!("head"),
15    };
16
17    unsafe {
18        core::ptr::copy_nonoverlapping(head.as_ptr(), tailed as *mut u8, head.bytes().len());
19        *(tailed as *mut u8).add(head.bytes().len()) = 0;
20    };
21
22    return tailed as *const u8;
23}