tarp 0.10.1

Tarp is a code coverage tool
Documentation
use crate::errors::*;
use nix::libc::*;
use std::ffi::CString;
use std::{mem::uninitialized, ptr};

fn execute(program: CString, argv: &[CString], envar: &[CString]) -> Result<(), RunError> {
    let mut attr: posix_spawnattr_t = uninitialized();
    let mut res = posix_spawn_attr_init(&mut attr);
    if res != 0 {
        trace!("Can't initialise posix_spawnattr_t");
    }

    let flags = (POSIX_SPAWN_START_SUSPENDED | POSIX_SPAWN_SETEXEC | 0x0100) as i16;

    res = posix_spawnattr_setflags(&mut attr, flags);
    if res != 0 {
        trace!("Failed to set spawn flags");
    }

    let args: Vec<*mut c_char> = argv.iter().map(|s| s.clone().into_raw()).collect();

    args.push(ptr::null_mut());

    let mut envs: Vec<*mut c_char> = envar.iter().map(|s| s.clone().into_raw()).collect();

    envs.push(ptr::null_mut());

    posix_spawnp(
        ptr::nullptr(),
        program.into_raw(),
        ptr::null_mut(),
        &attr,
        args.as_ptr(),
        envs.as_ptr(),
    );

    Err(RunError::Internal)
}