alnyan/yggdrasil: implement file seek
This commit is contained in:
@@ -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),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user