//! Safe wrappers around various libc functions that we might want to reuse across modules.

use std::time::Duration;

#[allow(clippy::unnecessary_cast)]
pub const fn timeval_to_duration(val: &libc::timeval) -> Duration {
    let micros = val.tv_sec as i64 * (1E6 as i64) + val.tv_usec as i64;
    Duration::from_micros(micros as u64)
}

pub trait TimevalExt {
    fn as_micros(&self) -> i64;
    fn as_duration(&self) -> Duration;
}

impl TimevalExt for libc::timeval {
    fn as_micros(&self) -> i64 {
        timeval_to_duration(self).as_micros() as i64
    }

    fn as_duration(&self) -> Duration {
        timeval_to_duration(self)
    }
}

pub fn geteuid() -> u32 {
    unsafe { libc::geteuid() }
}
pub fn getegid() -> u32 {
    unsafe { libc::getegid() }
}
pub fn getpid() -> i32 {
    unsafe { libc::getpid() }
}
pub fn isatty(fd: i32) -> bool {
    // This returns false if the fd is valid but not a tty, or is invalid.
    // No place we currently call it really cares about the difference.
    return unsafe { libc::isatty(fd) } == 1;
}