abi: add fsync()/truncate()

This commit is contained in:
Mark Poliakov 2025-01-06 10:50:32 +02:00
parent dfa6f7c296
commit e5b287e090
8 changed files with 48 additions and 10 deletions

View File

@ -3,8 +3,9 @@ use core::mem::MaybeUninit;
pub(crate) use abi::{ pub(crate) use abi::{
error::Error, error::Error,
io::{ io::{
AccessMode, DirectoryEntry, FileAttr, FileMode, MountOptions, OpenOptions, PipeOptions, AccessMode, DirectoryEntry, FileAttr, FileMode, FileSync, MountOptions, OpenOptions,
PollControl, RawFd, TerminalOptions, TerminalSize, TimerOptions, UnmountOptions, PipeOptions, PollControl, RawFd, TerminalOptions, TerminalSize, TimerOptions,
UnmountOptions,
}, },
mem::{MappingFlags, MappingSource}, mem::{MappingFlags, MappingSource},
net::SocketType, net::SocketType,

View File

@ -4,7 +4,7 @@ use abi::{
error::Error, error::Error,
io::{ io::{
AccessMode, ChannelPublisherId, DeviceRequest, DirectoryEntry, FileAttr, FileControl, AccessMode, ChannelPublisherId, DeviceRequest, DirectoryEntry, FileAttr, FileControl,
FileMetadataUpdate, FileMode, FilesystemControl, MessageDestination, OpenOptions, FileMetadataUpdate, FileMode, FileSync, FilesystemControl, MessageDestination, OpenOptions,
PipeOptions, PollControl, RawFd, ReceivedMessageMetadata, Rename, SeekFrom, SentMessage, PipeOptions, PollControl, RawFd, ReceivedMessageMetadata, Rename, SeekFrom, SentMessage,
TerminalOptions, TerminalSize, TimerOptions, TerminalOptions, TerminalSize, TimerOptions,
}, },
@ -95,6 +95,18 @@ pub(crate) fn read(fd: RawFd, buffer: &mut [u8]) -> Result<usize, Error> {
run_with_io(&process, |io| io.files.file(fd)?.read(buffer)) 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<usize, Error> { pub(crate) fn read_at(fd: RawFd, pos: u64, buffer: &mut [u8]) -> Result<usize, Error> {
let thread = Thread::current(); let thread = Thread::current();
let process = thread.process(); let process = thread.process();

View File

@ -32,6 +32,11 @@ bitfield FileMode(u32) {
USER_READ: 8, USER_READ: 8,
} }
bitfield FileSync(u32) {
DATA: 0,
METADATA: 1,
}
bitfield AccessMode(u32) { bitfield AccessMode(u32) {
READ: 0, READ: 0,
WRITE: 1, WRITE: 1,

View File

@ -117,6 +117,8 @@ syscall close(fd: RawFd) -> Result<()>;
syscall write(fd: RawFd, data: &[u8]) -> Result<usize>; syscall write(fd: RawFd, data: &[u8]) -> Result<usize>;
syscall read(fd: RawFd, data: &mut [u8]) -> Result<usize>; syscall read(fd: RawFd, data: &mut [u8]) -> Result<usize>;
syscall seek(fd: RawFd, pos: SeekFrom, output: &mut u64) -> 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<usize>; syscall read_at(fd: RawFd, pos: u64, data: &mut [u8]) -> Result<usize>;
syscall write_at(fd: RawFd, pos: u64, data: &[u8]) -> Result<usize>; syscall write_at(fd: RawFd, pos: u64, data: &[u8]) -> Result<usize>;

View File

@ -2,6 +2,8 @@ use core::fmt;
use abi_lib::SyscallRegister; use abi_lib::SyscallRegister;
use crate::time::SystemTime;
use super::FileMode; use super::FileMode;
/// Describes an action done on a file descriptor /// Describes an action done on a file descriptor
@ -21,11 +23,24 @@ pub enum FileMetadataUpdateMode {
AndNot, AndNot,
} }
/// Describes how file times are updated
#[derive(Debug, Clone)]
pub struct FileTimesUpdate {
/// Last accessed time
pub atime: Option<SystemTime>,
/// Last modified time
pub mtime: Option<SystemTime>,
/// Created time
pub ctime: Option<SystemTime>,
}
/// Describes a modification to a file's metadata /// Describes a modification to a file's metadata
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub enum FileMetadataUpdate { pub enum FileMetadataUpdate {
/// Changes file permissions /// Changes file permissions
Permissions(FileMode, FileMetadataUpdateMode), Permissions(FileMode, FileMetadataUpdateMode),
/// Changes file mtime/atime/ctime
Times(FileTimesUpdate),
} }
/// Describes a seek operation for a regular file /// Describes a seek operation for a regular file

View File

@ -6,12 +6,14 @@ mod input;
mod terminal; mod terminal;
pub use crate::generated::{ pub use crate::generated::{
AccessMode, DirectoryEntry, FileAttr, FileMode, FileType, GroupId, MountOptions, OpenOptions, AccessMode, DirectoryEntry, FileAttr, FileMode, FileSync, FileType, GroupId, MountOptions,
PipeOptions, PollControl, RawFd, TimerOptions, UnmountOptions, UserId, OpenOptions, PipeOptions, PollControl, RawFd, TimerOptions, UnmountOptions, UserId,
}; };
pub use channel::{ChannelPublisherId, MessageDestination, ReceivedMessageMetadata, SentMessage}; pub use channel::{ChannelPublisherId, MessageDestination, ReceivedMessageMetadata, SentMessage};
pub use device::{DeviceRequest, Framebuffer}; 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 filesystem::FilesystemControl;
pub use input::{KeyboardKey, KeyboardKeyCode, KeyboardKeyEvent}; pub use input::{KeyboardKey, KeyboardKeyCode, KeyboardKeyEvent};
pub use terminal::{ pub use terminal::{

View File

@ -25,7 +25,8 @@ use core::str::FromStr;
pub use abi::io::{ pub use abi::io::{
AccessMode, DirectoryEntry, FileAttr, FileMetadataUpdate, FileMetadataUpdateMode, FileMode, 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}; use abi::{error::Error, io::DeviceRequest, process::ProcessOption, util::FixedString};

View File

@ -16,9 +16,9 @@ mod generated {
use abi::{ use abi::{
error::Error, error::Error,
io::{ io::{
AccessMode, ChannelPublisherId, DirectoryEntry, FileAttr, FileMode, MountOptions, AccessMode, ChannelPublisherId, DirectoryEntry, FileAttr, FileMode, FileSync,
OpenOptions, PipeOptions, PollControl, RawFd, TerminalOptions, TerminalSize, MountOptions, OpenOptions, PipeOptions, PollControl, RawFd, TerminalOptions,
TimerOptions, UnmountOptions, TerminalSize, TimerOptions, UnmountOptions,
}, },
mem::{MappingFlags, MappingSource}, mem::{MappingFlags, MappingSource},
net::SocketType, net::SocketType,