diff --git a/src/header/fcntl/mod.rs b/src/header/fcntl/mod.rs index 94a39ab..7ec147f 100644 --- a/src/header/fcntl/mod.rs +++ b/src/header/fcntl/mod.rs @@ -140,6 +140,9 @@ unsafe extern "C" fn fcntl(fd: c_int, cmd: c_int, args: ...) -> CIntCountResult let file = RawFile::e_try_from(fd)?; match cmd { + // TODO implement these somehow? + F_GETFD => CIntCountResult(0), + F_SETFD => CIntCountResult(0), _ => todo!("fcntl({}, {}, ...)", fd, cmd), } } diff --git a/src/header/sys_stat/mod.rs b/src/header/sys_stat/mod.rs index 2fc92f2..2651b97 100644 --- a/src/header/sys_stat/mod.rs +++ b/src/header/sys_stat/mod.rs @@ -4,7 +4,7 @@ use yggdrasil_rt::io::{FileAttr, FileMode, FileType, RawFd}; use crate::{ error::{CIntZeroResult, TryFromExt}, - io, + io, process, util::{self, Nullable}, }; @@ -74,8 +74,8 @@ impl From for stat { } st.st_size = value.size.try_into().unwrap(); // TODO - st.st_uid = 0; - st.st_gid = 0; + st.st_uid = u32::from(value.uid).try_into().unwrap(); + st.st_gid = u32::from(value.gid).try_into().unwrap(); // TODO st.st_blksize = 512; st.st_blocks = (st.st_size + 511) / 512; @@ -108,7 +108,9 @@ unsafe extern "C" fn fchmodat( #[no_mangle] unsafe extern "C" fn umask(mode: mode_t) -> mode_t { - todo!() + let new = FileMode::new((mode as u32) & 0o777); + let old = process::update_umask(new); + old.bits() as mode_t } // Create stuff diff --git a/src/io/buffered.rs b/src/io/buffered.rs index 7493a6f..3ed5c85 100644 --- a/src/io/buffered.rs +++ b/src/io/buffered.rs @@ -150,6 +150,7 @@ impl Write for BufWriter { fn write(&mut self, mut data: &[u8]) -> EResult { if data.len() + self.buffer.len() >= self.buffer.capacity() { self.flush()?; + assert_eq!(self.buffer.len(), 0); } let len = data.len(); @@ -167,7 +168,7 @@ impl Write for BufWriter { } // Store the data in the buffer - assert!(data.len() < self.buffer.capacity()); + assert!(data.len() <= self.buffer.capacity()); self.buffer.extend_from_slice(data); EResult::Ok(len) } diff --git a/src/process.rs b/src/process.rs index 4cd789e..08b5b8a 100644 --- a/src/process.rs +++ b/src/process.rs @@ -2,7 +2,8 @@ use core::{ffi::c_char, ptr::null_mut, slice::memchr}; use alloc::{ffi::CString, vec::Vec}; use yggdrasil_rt::{ - process::{ExitCode, ProgramArgumentInner, Signal}, + io::FileMode, + process::{ExitCode, ProcessInfoElement, ProgramArgumentInner, Signal}, sys as syscall, }; @@ -81,6 +82,32 @@ pub fn abort() -> ! { } } +pub fn get_process_info(info: &mut ProcessInfoElement) -> EResult<()> { + unsafe { + syscall::get_process_info(info)?; + } + EResult::Ok(()) +} + +pub fn set_process_info(info: &ProcessInfoElement) -> EResult<()> { + unsafe { + syscall::set_process_info(info)?; + } + EResult::Ok(()) +} + +pub fn update_umask(new: FileMode) -> FileMode { + let mut old = ProcessInfoElement::Umask(FileMode::empty()); + let new = ProcessInfoElement::Umask(new); + + get_process_info(&mut old).unwrap(); + set_process_info(&new).unwrap(); + + let ProcessInfoElement::Umask(old) = old; + + old +} + // Env static mut ENVS: Vec = Vec::new();