lx 0.4.0

A no_std crate to use Linux system calls
Documentation
use core::fmt;

use crate::{
    eprintln,
    syscalls::{
        close,
        write,
    },
};

pub type RawFd = i32;

pub trait AsRawFd {
    fn as_raw_fd(&self) -> RawFd;
}

impl AsRawFd for RawFd {
    fn as_raw_fd(&self) -> RawFd {
        *self
    }
}

pub struct OwnedFd(RawFd);

impl OwnedFd {
    pub fn new(fd: RawFd) -> Self {
        Self(fd)
    }
}

impl AsRawFd for OwnedFd {
    fn as_raw_fd(&self) -> RawFd {
        self.0
    }
}

impl fmt::Write for OwnedFd {
    fn write_str(&mut self, s: &str) -> fmt::Result {
        if write(self, s.as_bytes()).is_err() {
            return Err(fmt::Error);
        }
        Ok(())
    }
}

impl Drop for OwnedFd {
    fn drop(&mut self) {
        if let Err(e) = close(self) {
            eprintln!("close({fd}): {e}", fd = self.as_raw_fd());
        }
    }
}