2024-03-01 23:04:53 -07:00
|
|
|
|
/*
|
|
|
|
|
* Copyright (c) 2024 Emma Tebibyte <emma@tebibyte.media>
|
|
|
|
|
* SPDX-License-Identifier: FSFAP
|
|
|
|
|
*
|
|
|
|
|
* Copying and distribution of this file, with or without modification, are
|
|
|
|
|
* permitted in any medium without royalty provided the copyright notice and
|
|
|
|
|
* this notice are preserved. This file is offered as-is, without any warranty.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
use std::ffi::{ c_int, c_char, CStr };
|
|
|
|
|
|
2024-03-18 21:30:43 -06:00
|
|
|
|
pub trait StrError { fn strerror(&self) -> String; }
|
2024-03-01 23:04:53 -07:00
|
|
|
|
|
2024-03-18 21:30:43 -06:00
|
|
|
|
impl StrError for std::io::Error {
|
|
|
|
|
/* wrapper function for use in Rust */
|
|
|
|
|
fn strerror(&self) -> String {
|
|
|
|
|
/* Get the raw OS error. If it’s None, what the hell is going on‽ */
|
|
|
|
|
let errno = self.raw_os_error().unwrap_or(0) as c_int;
|
2024-03-01 23:04:53 -07:00
|
|
|
|
|
2024-03-18 21:30:43 -06:00
|
|
|
|
/* Get a CStr from the error message so that it’s referenced and then
|
|
|
|
|
* convert it to an owned value. If the string is not valid UTF-8,
|
|
|
|
|
* return that error instead. */
|
|
|
|
|
match unsafe { CStr::from_ptr(strerror(errno)) }.to_str() {
|
|
|
|
|
Ok(s) => s.to_owned(), // yay!! :D
|
|
|
|
|
Err(e) => e.to_string(), // awww :(
|
|
|
|
|
}
|
2024-03-01 23:04:53 -07:00
|
|
|
|
}
|
|
|
|
|
}
|
2024-03-18 21:30:43 -06:00
|
|
|
|
|
|
|
|
|
/* binding to strerror(3p) */
|
|
|
|
|
extern "C" { fn strerror(errnum: c_int) -> *mut c_char; }
|