diff --git a/kernel/src/syscall/imp/mod.rs b/kernel/src/syscall/imp/mod.rs index b4b9ef7d..1e4aaac3 100644 --- a/kernel/src/syscall/imp/mod.rs +++ b/kernel/src/syscall/imp/mod.rs @@ -3,8 +3,9 @@ use core::mem::MaybeUninit; pub(crate) use abi::{ error::Error, io::{ - AccessMode, DirectoryEntry, FileAttr, FileMode, MountOptions, OpenOptions, PipeOptions, - PollControl, RawFd, TerminalOptions, TerminalSize, TimerOptions, UnmountOptions, + AccessMode, DirectoryEntry, FileAttr, FileMode, FileSync, MountOptions, OpenOptions, + PipeOptions, PollControl, RawFd, TerminalOptions, TerminalSize, TimerOptions, + UnmountOptions, }, mem::{MappingFlags, MappingSource}, net::SocketType, diff --git a/kernel/src/syscall/imp/sys_io.rs b/kernel/src/syscall/imp/sys_io.rs index 40aba23f..0966178a 100644 --- a/kernel/src/syscall/imp/sys_io.rs +++ b/kernel/src/syscall/imp/sys_io.rs @@ -4,7 +4,7 @@ use abi::{ error::Error, io::{ AccessMode, ChannelPublisherId, DeviceRequest, DirectoryEntry, FileAttr, FileControl, - FileMetadataUpdate, FileMode, FilesystemControl, MessageDestination, OpenOptions, + FileMetadataUpdate, FileMode, FileSync, FilesystemControl, MessageDestination, OpenOptions, PipeOptions, PollControl, RawFd, ReceivedMessageMetadata, Rename, SeekFrom, SentMessage, TerminalOptions, TerminalSize, TimerOptions, }, @@ -95,6 +95,18 @@ pub(crate) fn read(fd: RawFd, buffer: &mut [u8]) -> Result { run_with_io(&process, |io| io.files.file(fd)?.read(buffer)) } +pub(crate) fn truncate(fd: RawFd, size: u64) -> Result<(), Error> { + let _ = fd; + let _ = size; + todo!() +} + +pub(crate) fn fsync(fd: RawFd, what: FileSync) -> Result<(), Error> { + let _ = fd; + let _ = what; + todo!() +} + pub(crate) fn read_at(fd: RawFd, pos: u64, buffer: &mut [u8]) -> Result { let thread = Thread::current(); let process = thread.process(); diff --git a/lib/abi/def/io.abi b/lib/abi/def/io.abi index 6518775f..1198aec8 100644 --- a/lib/abi/def/io.abi +++ b/lib/abi/def/io.abi @@ -32,6 +32,11 @@ bitfield FileMode(u32) { USER_READ: 8, } +bitfield FileSync(u32) { + DATA: 0, + METADATA: 1, +} + bitfield AccessMode(u32) { READ: 0, WRITE: 1, diff --git a/lib/abi/def/yggdrasil.abi b/lib/abi/def/yggdrasil.abi index c65c06d2..2ca678af 100644 --- a/lib/abi/def/yggdrasil.abi +++ b/lib/abi/def/yggdrasil.abi @@ -117,6 +117,8 @@ syscall close(fd: RawFd) -> Result<()>; syscall write(fd: RawFd, data: &[u8]) -> Result; syscall read(fd: RawFd, data: &mut [u8]) -> Result; syscall seek(fd: RawFd, pos: SeekFrom, output: &mut u64) -> Result<()>; +syscall truncate(fd: RawFd, size: u64) -> Result<()>; +syscall fsync(fd: RawFd, what: FileSync) -> Result<()>; syscall read_at(fd: RawFd, pos: u64, data: &mut [u8]) -> Result; syscall write_at(fd: RawFd, pos: u64, data: &[u8]) -> Result; diff --git a/lib/abi/src/io/file.rs b/lib/abi/src/io/file.rs index 9d5989c3..9d6a68bb 100644 --- a/lib/abi/src/io/file.rs +++ b/lib/abi/src/io/file.rs @@ -2,6 +2,8 @@ use core::fmt; use abi_lib::SyscallRegister; +use crate::time::SystemTime; + use super::FileMode; /// Describes an action done on a file descriptor @@ -21,11 +23,24 @@ pub enum FileMetadataUpdateMode { AndNot, } +/// Describes how file times are updated +#[derive(Debug, Clone)] +pub struct FileTimesUpdate { + /// Last accessed time + pub atime: Option, + /// Last modified time + pub mtime: Option, + /// Created time + pub ctime: Option, +} + /// Describes a modification to a file's metadata #[derive(Debug, Clone)] pub enum FileMetadataUpdate { /// Changes file permissions Permissions(FileMode, FileMetadataUpdateMode), + /// Changes file mtime/atime/ctime + Times(FileTimesUpdate), } /// Describes a seek operation for a regular file diff --git a/lib/abi/src/io/mod.rs b/lib/abi/src/io/mod.rs index 1ed109e2..a23d656a 100644 --- a/lib/abi/src/io/mod.rs +++ b/lib/abi/src/io/mod.rs @@ -6,12 +6,14 @@ mod input; mod terminal; pub use crate::generated::{ - AccessMode, DirectoryEntry, FileAttr, FileMode, FileType, GroupId, MountOptions, OpenOptions, - PipeOptions, PollControl, RawFd, TimerOptions, UnmountOptions, UserId, + AccessMode, DirectoryEntry, FileAttr, FileMode, FileSync, FileType, GroupId, MountOptions, + OpenOptions, PipeOptions, PollControl, RawFd, TimerOptions, UnmountOptions, UserId, }; pub use channel::{ChannelPublisherId, MessageDestination, ReceivedMessageMetadata, SentMessage}; pub use device::{DeviceRequest, Framebuffer}; -pub use file::{FileControl, FileMetadataUpdate, FileMetadataUpdateMode, SeekFrom}; +pub use file::{ + FileControl, FileMetadataUpdate, FileMetadataUpdateMode, FileTimesUpdate, SeekFrom, +}; pub use filesystem::FilesystemControl; pub use input::{KeyboardKey, KeyboardKeyCode, KeyboardKeyEvent}; pub use terminal::{ diff --git a/lib/runtime/src/io.rs b/lib/runtime/src/io.rs index 6e2b9c55..bdeef76e 100644 --- a/lib/runtime/src/io.rs +++ b/lib/runtime/src/io.rs @@ -25,7 +25,8 @@ use core::str::FromStr; pub use abi::io::{ AccessMode, DirectoryEntry, FileAttr, FileMetadataUpdate, FileMetadataUpdateMode, FileMode, - FileType, OpenOptions, PipeOptions, RawFd, Rename, SeekFrom, TimerOptions, + FileSync, FileTimesUpdate, FileType, OpenOptions, PipeOptions, RawFd, Rename, SeekFrom, + TimerOptions, }; use abi::{error::Error, io::DeviceRequest, process::ProcessOption, util::FixedString}; diff --git a/lib/runtime/src/sys/mod.rs b/lib/runtime/src/sys/mod.rs index dee77d47..7990b98f 100644 --- a/lib/runtime/src/sys/mod.rs +++ b/lib/runtime/src/sys/mod.rs @@ -16,9 +16,9 @@ mod generated { use abi::{ error::Error, io::{ - AccessMode, ChannelPublisherId, DirectoryEntry, FileAttr, FileMode, MountOptions, - OpenOptions, PipeOptions, PollControl, RawFd, TerminalOptions, TerminalSize, - TimerOptions, UnmountOptions, + AccessMode, ChannelPublisherId, DirectoryEntry, FileAttr, FileMode, FileSync, + MountOptions, OpenOptions, PipeOptions, PollControl, RawFd, TerminalOptions, + TerminalSize, TimerOptions, UnmountOptions, }, mem::{MappingFlags, MappingSource}, net::SocketType,