1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
use std::ffi::{CString, OsStr}; use std::io::Result; use std::slice; use libc::{c_char, c_int}; use std::os::unix::prelude::*; pub fn ptr_to_os_str<'a>(ptr: *const c_char) -> Option<&'a OsStr> { if ptr.is_null() { return None; } Some(unsafe { ptr_to_os_str_unchecked(ptr) }) } pub unsafe fn ptr_to_os_str_unchecked<'a>(ptr: *const c_char) -> &'a OsStr { OsStr::from_bytes(slice::from_raw_parts( ptr as *const u8, libc::strlen(ptr) as usize, )) } pub fn os_str_to_cstring<T: AsRef<OsStr>>(s: T) -> Result<CString> { match CString::new(s.as_ref().as_bytes()) { Ok(s) => Ok(s), Err(_) => Err(std::io::Error::from_raw_os_error(libc::EINVAL)), } } pub fn errno_to_result(errno: c_int) -> Result<()> { match errno { 0 => Ok(()), e => Err(std::io::Error::from_raw_os_error(e)), } }