use libc::c_int;
#[allow(non_camel_case_types)]
pub type errno_t = c_int;
extern "C" {
fn _get_doserrno(errnum: *mut c_int) -> errno_t;
fn _set_doserrno(errnum: c_int) -> errno_t;
fn _get_errno(errnum: *mut c_int) -> errno_t;
fn _set_errno(errnum: c_int) -> errno_t;
}
pub fn doserrno() -> c_int {
unsafe {
let mut errnum: c_int = 0;
_get_doserrno(&mut errnum);
errnum
}
}
pub fn errno() -> c_int {
unsafe {
let mut errnum: c_int = 0;
_get_errno(&mut errnum);
errnum
}
}
pub fn zero() {
unsafe {
_set_doserrno(0);
_set_errno(0);
}
}
#[cfg(test)]
mod tests {
use crate::errno;
use super::_set_doserrno;
use super::_set_errno;
#[test]
fn test_doserrno() {
unsafe { _set_doserrno(libc::EACCES); }
assert_eq!(errno::doserrno(), libc::EACCES);
}
#[test]
fn test_errno() {
unsafe { _set_errno(libc::EACCES); }
assert_eq!(errno::errno(), libc::EACCES);
}
#[test]
fn test_zero() {
unsafe {
_set_doserrno(libc::EACCES);
_set_errno(libc::EACCES);
}
errno::zero();
assert_eq!(errno::doserrno(), 0);
assert_eq!(errno::errno(), 0);
}
}