diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2025-02-17 17:06:10 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-02-17 17:06:10 +0100 |
| commit | 10018d8e10e8aee01454c362a2793ac9cdaedeab (patch) | |
| tree | 7f3227c1a2442e2eefddc81edd6f3d2505e8e93e | |
| parent | 97962d7643300b91c102496ba3ab6d9279d2c536 (diff) | |
| parent | 711247413465fc015420574d6afe929186ab0bb4 (diff) | |
| download | rust-10018d8e10e8aee01454c362a2793ac9cdaedeab.tar.gz rust-10018d8e10e8aee01454c362a2793ac9cdaedeab.zip | |
Rollup merge of #137165 - thaliaarchi:file-tell, r=ChrisDenton
Use `tell` for `<File as Seek>::stream_position` Some platforms have a more efficient way to get the current offset of the file than by seeking. For example, Wasi has `fd_tell` and SOLID has `SOLID_FS_Ftell`. Implement `<File as Seek>::stream_position()` in terms of those. I do not use any APIs that were not already used in `std`. Although, the `libc` crate has [`ftell`](https://docs.rs/libc/latest/libc/fn.ftell.html), [`ftello`](https://docs.rs/libc/latest/libc/fn.ftello.html), and [`ftello64`](https://docs.rs/libc/latest/libc/fn.ftello64.html), I do not know platform coverage. It appears that Windows has no `tell`-like API. I have checked that it builds on each relevant platform.
| -rw-r--r-- | library/std/src/fs.rs | 6 | ||||
| -rw-r--r-- | library/std/src/sys/pal/hermit/fs.rs | 4 | ||||
| -rw-r--r-- | library/std/src/sys/pal/solid/fs.rs | 5 | ||||
| -rw-r--r-- | library/std/src/sys/pal/uefi/fs.rs | 4 | ||||
| -rw-r--r-- | library/std/src/sys/pal/unix/fs.rs | 4 | ||||
| -rw-r--r-- | library/std/src/sys/pal/unsupported/fs.rs | 4 | ||||
| -rw-r--r-- | library/std/src/sys/pal/wasi/fs.rs | 4 | ||||
| -rw-r--r-- | library/std/src/sys/pal/windows/fs.rs | 4 |
8 files changed, 34 insertions, 1 deletions
diff --git a/library/std/src/fs.rs b/library/std/src/fs.rs index 83b009c86dc..6001a2e2f39 100644 --- a/library/std/src/fs.rs +++ b/library/std/src/fs.rs @@ -1229,6 +1229,9 @@ impl Seek for &File { fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> { self.inner.seek(pos) } + fn stream_position(&mut self) -> io::Result<u64> { + self.inner.tell() + } } #[stable(feature = "rust1", since = "1.0.0")] @@ -1275,6 +1278,9 @@ impl Seek for File { fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> { (&*self).seek(pos) } + fn stream_position(&mut self) -> io::Result<u64> { + (&*self).stream_position() + } } #[stable(feature = "io_traits_arc", since = "1.73.0")] diff --git a/library/std/src/sys/pal/hermit/fs.rs b/library/std/src/sys/pal/hermit/fs.rs index 7bc36717f34..d4bf84dc185 100644 --- a/library/std/src/sys/pal/hermit/fs.rs +++ b/library/std/src/sys/pal/hermit/fs.rs @@ -421,6 +421,10 @@ impl File { Err(Error::from_raw_os_error(22)) } + pub fn tell(&self) -> io::Result<u64> { + self.seek(SeekFrom::Current(0)) + } + pub fn duplicate(&self) -> io::Result<File> { Err(Error::from_raw_os_error(22)) } diff --git a/library/std/src/sys/pal/solid/fs.rs b/library/std/src/sys/pal/solid/fs.rs index c87a63fde89..4e741943283 100644 --- a/library/std/src/sys/pal/solid/fs.rs +++ b/library/std/src/sys/pal/solid/fs.rs @@ -452,8 +452,11 @@ impl File { abi::SOLID_FS_Lseek(self.fd.raw(), pos, whence) }) .map_err(|e| e.as_io_error())?; - // Get the new offset + self.tell() + } + + pub fn tell(&self) -> io::Result<u64> { unsafe { let mut out_offset = MaybeUninit::uninit(); error::SolidError::err_if_negative(abi::SOLID_FS_Ftell( diff --git a/library/std/src/sys/pal/uefi/fs.rs b/library/std/src/sys/pal/uefi/fs.rs index 9585ec24f68..45e93deffa3 100644 --- a/library/std/src/sys/pal/uefi/fs.rs +++ b/library/std/src/sys/pal/uefi/fs.rs @@ -258,6 +258,10 @@ impl File { self.0 } + pub fn tell(&self) -> io::Result<u64> { + self.0 + } + pub fn duplicate(&self) -> io::Result<File> { self.0 } diff --git a/library/std/src/sys/pal/unix/fs.rs b/library/std/src/sys/pal/unix/fs.rs index 16fb207298d..3df460e38b7 100644 --- a/library/std/src/sys/pal/unix/fs.rs +++ b/library/std/src/sys/pal/unix/fs.rs @@ -1437,6 +1437,10 @@ impl File { Ok(n as u64) } + pub fn tell(&self) -> io::Result<u64> { + self.seek(SeekFrom::Current(0)) + } + pub fn duplicate(&self) -> io::Result<File> { self.0.duplicate().map(File) } diff --git a/library/std/src/sys/pal/unsupported/fs.rs b/library/std/src/sys/pal/unsupported/fs.rs index 9585ec24f68..45e93deffa3 100644 --- a/library/std/src/sys/pal/unsupported/fs.rs +++ b/library/std/src/sys/pal/unsupported/fs.rs @@ -258,6 +258,10 @@ impl File { self.0 } + pub fn tell(&self) -> io::Result<u64> { + self.0 + } + pub fn duplicate(&self) -> io::Result<File> { self.0 } diff --git a/library/std/src/sys/pal/wasi/fs.rs b/library/std/src/sys/pal/wasi/fs.rs index 11002406d2b..39978346d73 100644 --- a/library/std/src/sys/pal/wasi/fs.rs +++ b/library/std/src/sys/pal/wasi/fs.rs @@ -517,6 +517,10 @@ impl File { self.fd.seek(pos) } + pub fn tell(&self) -> io::Result<u64> { + self.fd.tell() + } + pub fn duplicate(&self) -> io::Result<File> { // https://github.com/CraneStation/wasmtime/blob/master/docs/WASI-rationale.md#why-no-dup unsupported() diff --git a/library/std/src/sys/pal/windows/fs.rs b/library/std/src/sys/pal/windows/fs.rs index ff02737dcf8..0ddce30cf8e 100644 --- a/library/std/src/sys/pal/windows/fs.rs +++ b/library/std/src/sys/pal/windows/fs.rs @@ -631,6 +631,10 @@ impl File { Ok(newpos as u64) } + pub fn tell(&self) -> io::Result<u64> { + self.seek(SeekFrom::Current(0)) + } + pub fn duplicate(&self) -> io::Result<File> { Ok(Self { handle: self.handle.try_clone()? }) } |
