/* * Copyright (c) 2024 Emma Tebibyte * 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 }; pub trait StrError { fn strerror(&self) -> String; } 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; /* 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 :( } } } /* binding to strerror(3p) */ extern "C" { fn strerror(errnum: c_int) -> *mut c_char; }