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