pledge 0.4.2

Rust binding to OpenBSD's pledge(2) interface
Documentation
extern crate libc;

use std::ffi::CString;
use std::os::raw::{c_char, c_int};
use std::ptr;

use Error;

pub fn pledge<'p, 'e, P, E>(promises: P, execpromises: E) -> Result<(), Error>
where P: Into<Option<&'p str>>, E: Into<Option<&'e str>> {
    extern "C" {
        fn pledge(promises: *const c_char, execpromises: *const c_char) -> c_int;
    }

    let promises = promises.into().map(|x| CString::new(x).map_err(Error::Promises));
    let execpromises = execpromises.into().map(|x| CString::new(x).map_err(Error::Execpromises));

    let promises = match promises {
        Some(Ok(ref result)) => Ok(result.as_ptr()),
        Some(Err(error)) => Err(error),
        None => Ok(ptr::null()),
    }?;

    let execpromises = match execpromises {
        Some(Ok(ref result)) => Ok(result.as_ptr()),
        Some(Err(error)) => Err(error),
        None => Ok(ptr::null()),
    }?;

    unsafe {
        return match pledge(promises, execpromises) {
            0 => Ok(()),
            _ => Err(Error::Other(*libc::__errno())),
        };
    }
}