1
Fork 0

Rollup merge of #138074 - thaliaarchi:hermit-seek, r=ChrisDenton

Support `File::seek` for Hermit

`lseek` was added in `hermit-abi` in commit [87dd201](87dd201a14) (add missing interface for lseek, 2024-07-15), which was just released in version 0.5.0.

cc ``@mkroening,`` ``@stlankes``

Fixes https://github.com/hermit-os/hermit-rs/issues/652
This commit is contained in:
Matthias Krüger 2025-03-10 09:32:13 +01:00 committed by GitHub
commit 2f1908df61
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 25 additions and 8 deletions

View file

@ -146,9 +146,9 @@ dependencies = [
[[package]]
name = "hermit-abi"
version = "0.4.0"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc"
checksum = "fbd780fe5cc30f81464441920d82ac8740e2e46b29a6fad543ddd075229ce37e"
dependencies = [
"compiler_builtins",
"rustc-std-workspace-alloc",

View file

@ -73,7 +73,7 @@ fortanix-sgx-abi = { version = "0.5.0", features = [
], public = true }
[target.'cfg(target_os = "hermit")'.dependencies]
hermit-abi = { version = "0.4.0", features = [
hermit-abi = { version = "0.5.0", features = [
'rustc-dep-of-std',
], public = true }

View file

@ -417,12 +417,12 @@ impl File {
Ok(())
}
pub fn seek(&self, _pos: SeekFrom) -> io::Result<u64> {
Err(Error::from_raw_os_error(22))
pub fn seek(&self, pos: SeekFrom) -> io::Result<u64> {
self.0.seek(pos)
}
pub fn tell(&self) -> io::Result<u64> {
self.seek(SeekFrom::Current(0))
self.0.tell()
}
pub fn duplicate(&self) -> io::Result<File> {

View file

@ -2,8 +2,8 @@
use super::hermit_abi;
use crate::cmp;
use crate::io::{self, IoSlice, IoSliceMut, Read};
use crate::os::hermit::io::{FromRawFd, OwnedFd, RawFd, *};
use crate::io::{self, IoSlice, IoSliceMut, Read, SeekFrom};
use crate::os::hermit::io::{AsFd, AsRawFd, BorrowedFd, FromRawFd, IntoRawFd, OwnedFd, RawFd};
use crate::sys::{cvt, unsupported};
use crate::sys_common::{AsInner, FromInner, IntoInner};
@ -66,9 +66,26 @@ impl FileDesc {
true
}
pub fn seek(&self, pos: SeekFrom) -> io::Result<u64> {
let (whence, pos) = match pos {
// Casting to `i64` is fine, too large values will end up as
// negative which will cause an error in `lseek`.
SeekFrom::Start(off) => (hermit_abi::SEEK_SET, off as i64),
SeekFrom::End(off) => (hermit_abi::SEEK_END, off),
SeekFrom::Current(off) => (hermit_abi::SEEK_CUR, off),
};
let n = cvt(unsafe { hermit_abi::lseek(self.as_raw_fd(), pos as isize, whence) })?;
Ok(n as u64)
}
pub fn tell(&self) -> io::Result<u64> {
self.seek(SeekFrom::Current(0))
}
pub fn duplicate(&self) -> io::Result<FileDesc> {
self.duplicate_path(&[])
}
pub fn duplicate_path(&self, _path: &[u8]) -> io::Result<FileDesc> {
unsupported()
}