Skip to content

Commit

Permalink
calls: Update params in execve()
Browse files Browse the repository at this point in the history
Fix issue: #22
  • Loading branch information
XuShaohua committed Jul 31, 2024
1 parent 461d4cb commit f422e0a
Show file tree
Hide file tree
Showing 11 changed files with 198 additions and 132 deletions.
30 changes: 18 additions & 12 deletions src/calls/execve.rs
Original file line number Diff line number Diff line change
@@ -1,24 +1,30 @@
/// Execute a new program.
///
/// TODO(Shaohua): type of argv and env will be changed.
/// And return value might be changed too.
///
/// # Examples
///
/// ```
/// let args = [""];
/// let env = [""];
/// let args = ["ls", "-l", "-a"];
/// let env = ["DISPLAY=:0"];
/// let ret = unsafe { nc::execve("/bin/ls", &args, &env) };
/// assert!(ret.is_ok());
/// ```
pub unsafe fn execve<P: AsRef<Path>>(
filename: P,
argv: &[&str],
env: &[&str],
) -> Result<(), Errno> {
pub unsafe fn execve<P: AsRef<Path>>(filename: P, argv: &[P], env: &[P]) -> Result<(), Errno> {
let filename = CString::new(filename.as_ref());
let filename_ptr = filename.as_ptr() as usize;
let argv_ptr = argv.as_ptr() as usize;
let env_ptr = env.as_ptr() as usize;

// Construct argument list.
let argv_data: Vec<CString> = argv.iter().map(|arg| CString::new(arg.as_ref())).collect();
let mut argv_data_ptr: Vec<*const u8> = argv_data.iter().map(|arg| arg.as_ptr()).collect();
// Null-terminated
argv_data_ptr.push(core::ptr::null::<u8>());
let argv_ptr = argv_data_ptr.as_ptr() as usize;

// Construct environment list.
let env_data: Vec<CString> = env.iter().map(|item| CString::new(item.as_ref())).collect();
let mut env_data_ptr: Vec<*const u8> = env_data.iter().map(|item| item.as_ptr()).collect();
// Null-terminated
env_data_ptr.push(core::ptr::null::<u8>());
let env_ptr = env_data_ptr.as_ptr() as usize;

syscall3(SYS_EXECVE, filename_ptr, argv_ptr, env_ptr).map(drop)
}
30 changes: 18 additions & 12 deletions src/platform/linux-aarch64/call.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1081,26 +1081,32 @@ pub unsafe fn eventfd2(count: u32, flags: i32) -> Result<i32, Errno> {

/// Execute a new program.
///
/// TODO(Shaohua): type of argv and env will be changed.
/// And return value might be changed too.
///
/// # Examples
///
/// ```
/// let args = [""];
/// let env = [""];
/// let args = ["ls", "-l", "-a"];
/// let env = ["DISPLAY=:0"];
/// let ret = unsafe { nc::execve("/bin/ls", &args, &env) };
/// assert!(ret.is_ok());
/// ```
pub unsafe fn execve<P: AsRef<Path>>(
filename: P,
argv: &[&str],
env: &[&str],
) -> Result<(), Errno> {
pub unsafe fn execve<P: AsRef<Path>>(filename: P, argv: &[P], env: &[P]) -> Result<(), Errno> {
let filename = CString::new(filename.as_ref());
let filename_ptr = filename.as_ptr() as usize;
let argv_ptr = argv.as_ptr() as usize;
let env_ptr = env.as_ptr() as usize;

// Construct argument list.
let argv_data: Vec<CString> = argv.iter().map(|arg| CString::new(arg.as_ref())).collect();
let mut argv_data_ptr: Vec<*const u8> = argv_data.iter().map(|arg| arg.as_ptr()).collect();
// Null-terminated
argv_data_ptr.push(core::ptr::null::<u8>());
let argv_ptr = argv_data_ptr.as_ptr() as usize;

// Construct environment list.
let env_data: Vec<CString> = env.iter().map(|item| CString::new(item.as_ref())).collect();
let mut env_data_ptr: Vec<*const u8> = env_data.iter().map(|item| item.as_ptr()).collect();
// Null-terminated
env_data_ptr.push(core::ptr::null::<u8>());
let env_ptr = env_data_ptr.as_ptr() as usize;

syscall3(SYS_EXECVE, filename_ptr, argv_ptr, env_ptr).map(drop)
}

Expand Down
30 changes: 18 additions & 12 deletions src/platform/linux-arm/call.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1298,26 +1298,32 @@ pub unsafe fn eventfd2(count: u32, flags: i32) -> Result<i32, Errno> {

/// Execute a new program.
///
/// TODO(Shaohua): type of argv and env will be changed.
/// And return value might be changed too.
///
/// # Examples
///
/// ```
/// let args = [""];
/// let env = [""];
/// let args = ["ls", "-l", "-a"];
/// let env = ["DISPLAY=:0"];
/// let ret = unsafe { nc::execve("/bin/ls", &args, &env) };
/// assert!(ret.is_ok());
/// ```
pub unsafe fn execve<P: AsRef<Path>>(
filename: P,
argv: &[&str],
env: &[&str],
) -> Result<(), Errno> {
pub unsafe fn execve<P: AsRef<Path>>(filename: P, argv: &[P], env: &[P]) -> Result<(), Errno> {
let filename = CString::new(filename.as_ref());
let filename_ptr = filename.as_ptr() as usize;
let argv_ptr = argv.as_ptr() as usize;
let env_ptr = env.as_ptr() as usize;

// Construct argument list.
let argv_data: Vec<CString> = argv.iter().map(|arg| CString::new(arg.as_ref())).collect();
let mut argv_data_ptr: Vec<*const u8> = argv_data.iter().map(|arg| arg.as_ptr()).collect();
// Null-terminated
argv_data_ptr.push(core::ptr::null::<u8>());
let argv_ptr = argv_data_ptr.as_ptr() as usize;

// Construct environment list.
let env_data: Vec<CString> = env.iter().map(|item| CString::new(item.as_ref())).collect();
let mut env_data_ptr: Vec<*const u8> = env_data.iter().map(|item| item.as_ptr()).collect();
// Null-terminated
env_data_ptr.push(core::ptr::null::<u8>());
let env_ptr = env_data_ptr.as_ptr() as usize;

syscall3(SYS_EXECVE, filename_ptr, argv_ptr, env_ptr).map(drop)
}

Expand Down
30 changes: 18 additions & 12 deletions src/platform/linux-loongarch64/call.rs
Original file line number Diff line number Diff line change
Expand Up @@ -935,26 +935,32 @@ pub unsafe fn eventfd2(count: u32, flags: i32) -> Result<i32, Errno> {

/// Execute a new program.
///
/// TODO(Shaohua): type of argv and env will be changed.
/// And return value might be changed too.
///
/// # Examples
///
/// ```
/// let args = [""];
/// let env = [""];
/// let args = ["ls", "-l", "-a"];
/// let env = ["DISPLAY=:0"];
/// let ret = unsafe { nc::execve("/bin/ls", &args, &env) };
/// assert!(ret.is_ok());
/// ```
pub unsafe fn execve<P: AsRef<Path>>(
filename: P,
argv: &[&str],
env: &[&str],
) -> Result<(), Errno> {
pub unsafe fn execve<P: AsRef<Path>>(filename: P, argv: &[P], env: &[P]) -> Result<(), Errno> {
let filename = CString::new(filename.as_ref());
let filename_ptr = filename.as_ptr() as usize;
let argv_ptr = argv.as_ptr() as usize;
let env_ptr = env.as_ptr() as usize;

// Construct argument list.
let argv_data: Vec<CString> = argv.iter().map(|arg| CString::new(arg.as_ref())).collect();
let mut argv_data_ptr: Vec<*const u8> = argv_data.iter().map(|arg| arg.as_ptr()).collect();
// Null-terminated
argv_data_ptr.push(core::ptr::null::<u8>());
let argv_ptr = argv_data_ptr.as_ptr() as usize;

// Construct environment list.
let env_data: Vec<CString> = env.iter().map(|item| CString::new(item.as_ref())).collect();
let mut env_data_ptr: Vec<*const u8> = env_data.iter().map(|item| item.as_ptr()).collect();
// Null-terminated
env_data_ptr.push(core::ptr::null::<u8>());
let env_ptr = env_data_ptr.as_ptr() as usize;

syscall3(SYS_EXECVE, filename_ptr, argv_ptr, env_ptr).map(drop)
}

Expand Down
30 changes: 18 additions & 12 deletions src/platform/linux-mips/call.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1337,26 +1337,32 @@ pub unsafe fn eventfd2(count: u32, flags: i32) -> Result<i32, Errno> {

/// Execute a new program.
///
/// TODO(Shaohua): type of argv and env will be changed.
/// And return value might be changed too.
///
/// # Examples
///
/// ```
/// let args = [""];
/// let env = [""];
/// let args = ["ls", "-l", "-a"];
/// let env = ["DISPLAY=:0"];
/// let ret = unsafe { nc::execve("/bin/ls", &args, &env) };
/// assert!(ret.is_ok());
/// ```
pub unsafe fn execve<P: AsRef<Path>>(
filename: P,
argv: &[&str],
env: &[&str],
) -> Result<(), Errno> {
pub unsafe fn execve<P: AsRef<Path>>(filename: P, argv: &[P], env: &[P]) -> Result<(), Errno> {
let filename = CString::new(filename.as_ref());
let filename_ptr = filename.as_ptr() as usize;
let argv_ptr = argv.as_ptr() as usize;
let env_ptr = env.as_ptr() as usize;

// Construct argument list.
let argv_data: Vec<CString> = argv.iter().map(|arg| CString::new(arg.as_ref())).collect();
let mut argv_data_ptr: Vec<*const u8> = argv_data.iter().map(|arg| arg.as_ptr()).collect();
// Null-terminated
argv_data_ptr.push(core::ptr::null::<u8>());
let argv_ptr = argv_data_ptr.as_ptr() as usize;

// Construct environment list.
let env_data: Vec<CString> = env.iter().map(|item| CString::new(item.as_ref())).collect();
let mut env_data_ptr: Vec<*const u8> = env_data.iter().map(|item| item.as_ptr()).collect();
// Null-terminated
env_data_ptr.push(core::ptr::null::<u8>());
let env_ptr = env_data_ptr.as_ptr() as usize;

syscall3(SYS_EXECVE, filename_ptr, argv_ptr, env_ptr).map(drop)
}

Expand Down
30 changes: 18 additions & 12 deletions src/platform/linux-mips64/call.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1321,26 +1321,32 @@ pub unsafe fn eventfd2(count: u32, flags: i32) -> Result<i32, Errno> {

/// Execute a new program.
///
/// TODO(Shaohua): type of argv and env will be changed.
/// And return value might be changed too.
///
/// # Examples
///
/// ```
/// let args = [""];
/// let env = [""];
/// let args = ["ls", "-l", "-a"];
/// let env = ["DISPLAY=:0"];
/// let ret = unsafe { nc::execve("/bin/ls", &args, &env) };
/// assert!(ret.is_ok());
/// ```
pub unsafe fn execve<P: AsRef<Path>>(
filename: P,
argv: &[&str],
env: &[&str],
) -> Result<(), Errno> {
pub unsafe fn execve<P: AsRef<Path>>(filename: P, argv: &[P], env: &[P]) -> Result<(), Errno> {
let filename = CString::new(filename.as_ref());
let filename_ptr = filename.as_ptr() as usize;
let argv_ptr = argv.as_ptr() as usize;
let env_ptr = env.as_ptr() as usize;

// Construct argument list.
let argv_data: Vec<CString> = argv.iter().map(|arg| CString::new(arg.as_ref())).collect();
let mut argv_data_ptr: Vec<*const u8> = argv_data.iter().map(|arg| arg.as_ptr()).collect();
// Null-terminated
argv_data_ptr.push(core::ptr::null::<u8>());
let argv_ptr = argv_data_ptr.as_ptr() as usize;

// Construct environment list.
let env_data: Vec<CString> = env.iter().map(|item| CString::new(item.as_ref())).collect();
let mut env_data_ptr: Vec<*const u8> = env_data.iter().map(|item| item.as_ptr()).collect();
// Null-terminated
env_data_ptr.push(core::ptr::null::<u8>());
let env_ptr = env_data_ptr.as_ptr() as usize;

syscall3(SYS_EXECVE, filename_ptr, argv_ptr, env_ptr).map(drop)
}

Expand Down
30 changes: 18 additions & 12 deletions src/platform/linux-ppc64/call.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1330,26 +1330,32 @@ pub unsafe fn eventfd2(count: u32, flags: i32) -> Result<i32, Errno> {

/// Execute a new program.
///
/// TODO(Shaohua): type of argv and env will be changed.
/// And return value might be changed too.
///
/// # Examples
///
/// ```
/// let args = [""];
/// let env = [""];
/// let args = ["ls", "-l", "-a"];
/// let env = ["DISPLAY=:0"];
/// let ret = unsafe { nc::execve("/bin/ls", &args, &env) };
/// assert!(ret.is_ok());
/// ```
pub unsafe fn execve<P: AsRef<Path>>(
filename: P,
argv: &[&str],
env: &[&str],
) -> Result<(), Errno> {
pub unsafe fn execve<P: AsRef<Path>>(filename: P, argv: &[P], env: &[P]) -> Result<(), Errno> {
let filename = CString::new(filename.as_ref());
let filename_ptr = filename.as_ptr() as usize;
let argv_ptr = argv.as_ptr() as usize;
let env_ptr = env.as_ptr() as usize;

// Construct argument list.
let argv_data: Vec<CString> = argv.iter().map(|arg| CString::new(arg.as_ref())).collect();
let mut argv_data_ptr: Vec<*const u8> = argv_data.iter().map(|arg| arg.as_ptr()).collect();
// Null-terminated
argv_data_ptr.push(core::ptr::null::<u8>());
let argv_ptr = argv_data_ptr.as_ptr() as usize;

// Construct environment list.
let env_data: Vec<CString> = env.iter().map(|item| CString::new(item.as_ref())).collect();
let mut env_data_ptr: Vec<*const u8> = env_data.iter().map(|item| item.as_ptr()).collect();
// Null-terminated
env_data_ptr.push(core::ptr::null::<u8>());
let env_ptr = env_data_ptr.as_ptr() as usize;

syscall3(SYS_EXECVE, filename_ptr, argv_ptr, env_ptr).map(drop)
}

Expand Down
30 changes: 18 additions & 12 deletions src/platform/linux-riscv64/call.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1081,26 +1081,32 @@ pub unsafe fn eventfd2(count: u32, flags: i32) -> Result<i32, Errno> {

/// Execute a new program.
///
/// TODO(Shaohua): type of argv and env will be changed.
/// And return value might be changed too.
///
/// # Examples
///
/// ```
/// let args = [""];
/// let env = [""];
/// let args = ["ls", "-l", "-a"];
/// let env = ["DISPLAY=:0"];
/// let ret = unsafe { nc::execve("/bin/ls", &args, &env) };
/// assert!(ret.is_ok());
/// ```
pub unsafe fn execve<P: AsRef<Path>>(
filename: P,
argv: &[&str],
env: &[&str],
) -> Result<(), Errno> {
pub unsafe fn execve<P: AsRef<Path>>(filename: P, argv: &[P], env: &[P]) -> Result<(), Errno> {
let filename = CString::new(filename.as_ref());
let filename_ptr = filename.as_ptr() as usize;
let argv_ptr = argv.as_ptr() as usize;
let env_ptr = env.as_ptr() as usize;

// Construct argument list.
let argv_data: Vec<CString> = argv.iter().map(|arg| CString::new(arg.as_ref())).collect();
let mut argv_data_ptr: Vec<*const u8> = argv_data.iter().map(|arg| arg.as_ptr()).collect();
// Null-terminated
argv_data_ptr.push(core::ptr::null::<u8>());
let argv_ptr = argv_data_ptr.as_ptr() as usize;

// Construct environment list.
let env_data: Vec<CString> = env.iter().map(|item| CString::new(item.as_ref())).collect();
let mut env_data_ptr: Vec<*const u8> = env_data.iter().map(|item| item.as_ptr()).collect();
// Null-terminated
env_data_ptr.push(core::ptr::null::<u8>());
let env_ptr = env_data_ptr.as_ptr() as usize;

syscall3(SYS_EXECVE, filename_ptr, argv_ptr, env_ptr).map(drop)
}

Expand Down
Loading

0 comments on commit f422e0a

Please sign in to comment.