alnyan/yggdrasil: implement file seek

This commit is contained in:
2023-07-22 17:37:08 +03:00
parent 19819a25a2
commit 4621c13b78
+19 -5
View File
@@ -3,11 +3,14 @@ use crate::os::yggdrasil::io::{AsFd, AsRawFd, BorrowedFd, FromRawFd, IntoRawFd,
use crate::path::Path;
use crate::sys::cvt_io;
use crate::sys::fd::FileDesc;
use crate::sys::fs::get_metadata_inner;
use crate::sys_common::{AsInner, AsInnerMut, FromInner, IntoInner};
use super::{FileAttr, FilePermissions, FileTimes};
use yggdrasil_rt::io::{FileMode as OsFileMode, OpenOptions as OsOpenOptions};
use yggdrasil_rt::io::{
FileMode as OsFileMode, OpenOptions as OsOpenOptions, SeekFrom as OsSeekFrom,
};
#[derive(Debug)]
pub struct File(FileDesc);
@@ -82,13 +85,13 @@ impl File {
pub fn open(path: &Path, opts: &OpenOptions) -> io::Result<File> {
let path = path.as_os_str();
unsafe {
cvt_io(yggdrasil_rt::sys::open(path.to_str().unwrap(), opts.options, opts.mode))
cvt_io(yggdrasil_rt::sys::open(None, path.to_str().unwrap(), opts.options, opts.mode))
.map(|fd| File::from_raw_fd(fd))
}
}
pub fn file_attr(&self) -> io::Result<FileAttr> {
todo!()
get_metadata_inner(Some(self.as_raw_fd()), "", true)
}
pub fn fsync(&self) -> io::Result<()> {
@@ -137,8 +140,8 @@ impl File {
todo!()
}
pub fn seek(&self, _pos: SeekFrom) -> io::Result<u64> {
todo!()
pub fn seek(&self, pos: SeekFrom) -> io::Result<u64> {
unsafe { cvt_io(yggdrasil_rt::sys::seek(self.as_raw_fd(), pos.into())) }
}
pub fn duplicate(&self) -> io::Result<File> {
@@ -201,3 +204,14 @@ impl FromRawFd for File {
Self(FromRawFd::from_raw_fd(raw_fd))
}
}
#[stable(feature = "yggdrasil_os", since = "1.70.0")]
impl From<SeekFrom> for OsSeekFrom {
fn from(value: SeekFrom) -> OsSeekFrom {
match value {
SeekFrom::Start(v) => OsSeekFrom::Start(v),
SeekFrom::End(v) => OsSeekFrom::End(v),
SeekFrom::Current(v) => OsSeekFrom::Current(v),
}
}
}