|
2 | 2 |
|
3 | 3 | use super::hermit_abi;
|
4 | 4 | use crate::cmp;
|
5 |
| -use crate::io::{self, IoSlice, IoSliceMut, Read}; |
6 |
| -use crate::os::hermit::io::{FromRawFd, OwnedFd, RawFd, *}; |
| 5 | +use crate::io::{self, IoSlice, IoSliceMut, Read, SeekFrom}; |
| 6 | +use crate::os::hermit::io::{AsFd, AsRawFd, BorrowedFd, FromRawFd, IntoRawFd, OwnedFd, RawFd}; |
7 | 7 | use crate::sys::{cvt, unsupported};
|
8 | 8 | use crate::sys_common::{AsInner, FromInner, IntoInner};
|
9 | 9 |
|
@@ -66,9 +66,26 @@ impl FileDesc {
|
66 | 66 | true
|
67 | 67 | }
|
68 | 68 |
|
| 69 | + pub fn seek(&self, pos: SeekFrom) -> io::Result<u64> { |
| 70 | + let (whence, pos) = match pos { |
| 71 | + // Casting to `i64` is fine, too large values will end up as |
| 72 | + // negative which will cause an error in `lseek`. |
| 73 | + SeekFrom::Start(off) => (hermit_abi::SEEK_SET, off as i64), |
| 74 | + SeekFrom::End(off) => (hermit_abi::SEEK_END, off), |
| 75 | + SeekFrom::Current(off) => (hermit_abi::SEEK_CUR, off), |
| 76 | + }; |
| 77 | + let n = cvt(unsafe { hermit_abi::lseek(self.as_raw_fd(), pos as isize, whence) })?; |
| 78 | + Ok(n as u64) |
| 79 | + } |
| 80 | + |
| 81 | + pub fn tell(&self) -> io::Result<u64> { |
| 82 | + self.seek(SeekFrom::Current(0)) |
| 83 | + } |
| 84 | + |
69 | 85 | pub fn duplicate(&self) -> io::Result<FileDesc> {
|
70 | 86 | self.duplicate_path(&[])
|
71 | 87 | }
|
| 88 | + |
72 | 89 | pub fn duplicate_path(&self, _path: &[u8]) -> io::Result<FileDesc> {
|
73 | 90 | unsupported()
|
74 | 91 | }
|
|
0 commit comments