Browse Source

virt pipes: return concrete errors, best effort at flags and filestat

pull/2577/head
Pat Hickey 4 years ago
parent
commit
f9ff97aac1
  1. 104
      crates/wasi-c2/src/virt/pipe.rs

104
crates/wasi-c2/src/virt/pipe.rs

@ -97,10 +97,10 @@ impl From<&str> for ReadPipe<io::Cursor<String>> {
impl<R: Read> FileIoExt for ReadPipe<R> {
fn advise(&self, offset: u64, len: u64, advice: Advice) -> io::Result<()> {
todo!() // advice cant be taken. do we ignore or throw error?
Err(std::io::Error::from_raw_os_error(libc::EBADF))
}
fn allocate(&self, offset: u64, len: u64) -> io::Result<()> {
todo!() // error: requires write, seek
Err(std::io::Error::from_raw_os_error(libc::EBADF))
}
fn read(&self, buf: &mut [u8]) -> io::Result<usize> {
self.borrow().read(buf)
@ -109,10 +109,10 @@ impl<R: Read> FileIoExt for ReadPipe<R> {
self.borrow().read_exact(buf)
}
fn read_at(&self, buf: &mut [u8], offset: u64) -> io::Result<usize> {
todo!() // error: requires seek
Err(std::io::Error::from_raw_os_error(libc::EBADF))
}
fn read_exact_at(&self, buf: &mut [u8], offset: u64) -> io::Result<()> {
todo!() // error: requires seek
Err(std::io::Error::from_raw_os_error(libc::EBADF))
}
fn read_vectored(&self, bufs: &mut [io::IoSliceMut]) -> io::Result<usize> {
self.borrow().read_vectored(bufs)
@ -124,37 +124,37 @@ impl<R: Read> FileIoExt for ReadPipe<R> {
self.borrow().read_to_string(buf)
}
fn bytes(self) -> io::Bytes<std::fs::File> {
todo!() // impossible to construct this concrete iterator, fix in system-interface
panic!("impossible to implement, removing from trait")
}
fn take(self, limit: u64) -> io::Take<std::fs::File> {
todo!() // impossible to construct this concrete iterator, fix in system-interface
panic!("impossible to implement, removing from trait")
}
fn write(&self, buf: &[u8]) -> io::Result<usize> {
todo!() // error: requires write
Err(std::io::Error::from_raw_os_error(libc::EBADF))
}
fn write_all(&self, buf: &[u8]) -> io::Result<()> {
todo!() // error: requires write
Err(std::io::Error::from_raw_os_error(libc::EBADF))
}
fn write_at(&self, buf: &[u8], offset: u64) -> io::Result<usize> {
todo!() // error: requires write, seek
Err(std::io::Error::from_raw_os_error(libc::EBADF))
}
fn write_all_at(&self, buf: &[u8], offset: u64) -> io::Result<()> {
todo!() // error: requires write, seek
Err(std::io::Error::from_raw_os_error(libc::EBADF))
}
fn write_vectored(&self, bufs: &[io::IoSlice]) -> io::Result<usize> {
todo!() // error: requires write
Err(std::io::Error::from_raw_os_error(libc::EBADF))
}
fn write_fmt(&mut self, fmt: std::fmt::Arguments) -> io::Result<()> {
todo!() // error: requires write
Err(std::io::Error::from_raw_os_error(libc::EBADF))
}
fn flush(&self) -> io::Result<()> {
todo!() // error: requires write
Err(std::io::Error::from_raw_os_error(libc::EBADF))
}
fn seek(&self, pos: std::io::SeekFrom) -> io::Result<u64> {
todo!() // error: requires seek
fn seek(&self, _pos: std::io::SeekFrom) -> io::Result<u64> {
Err(std::io::Error::from_raw_os_error(libc::ESPIPE))
}
fn stream_position(&self) -> io::Result<u64> {
todo!() // error: requires seek
Err(std::io::Error::from_raw_os_error(libc::ESPIPE))
}
}
@ -178,22 +178,31 @@ impl<R: Read> WasiFile for ReadPipe<R> {
Ok(Filetype::CharacterDevice) // XXX wrong
}
fn get_fdflags(&self) -> Result<FdFlags, Error> {
todo!() // do later
Ok(FdFlags::empty())
}
fn set_fdflags(&self, _fdflags: FdFlags) -> Result<(), Error> {
todo!()
Err(Error::Perm)
}
fn get_oflags(&self) -> Result<OFlags, Error> {
todo!() // do later
Ok(OFlags::empty())
}
fn set_oflags(&self, _flags: OFlags) -> Result<(), Error> {
todo!() // impossible?
Err(Error::Perm)
}
fn get_filestat(&self) -> Result<Filestat, Error> {
todo!() // do later
Ok(Filestat {
device_id: 0,
inode: 0,
filetype: self.get_filetype()?,
nlink: 0,
size: 0, // XXX no way to get a size out of a Read :(
atim: None,
mtim: None,
ctim: None,
})
}
fn set_filestat_size(&self, _size: u64) -> Result<(), Error> {
todo!() // impossible?
Err(Error::Perm)
}
}
@ -253,37 +262,37 @@ impl WritePipe<io::Cursor<Vec<u8>>> {
impl<W: Write> FileIoExt for WritePipe<W> {
fn advise(&self, offset: u64, len: u64, advice: Advice) -> io::Result<()> {
todo!()
Err(std::io::Error::from_raw_os_error(libc::EBADF))
}
fn allocate(&self, offset: u64, len: u64) -> io::Result<()> {
todo!() // error: requires seek
Err(std::io::Error::from_raw_os_error(libc::EBADF))
}
fn read(&self, buf: &mut [u8]) -> io::Result<usize> {
todo!() // error: requires read
Err(std::io::Error::from_raw_os_error(libc::EBADF))
}
fn read_exact(&self, buf: &mut [u8]) -> io::Result<()> {
todo!() // error: requires read
Err(std::io::Error::from_raw_os_error(libc::EBADF))
}
fn read_at(&self, buf: &mut [u8], offset: u64) -> io::Result<usize> {
todo!() // error: requires read, seek
Err(std::io::Error::from_raw_os_error(libc::EBADF))
}
fn read_exact_at(&self, buf: &mut [u8], offset: u64) -> io::Result<()> {
todo!() // error: requires read, seek
Err(std::io::Error::from_raw_os_error(libc::EBADF))
}
fn read_vectored(&self, bufs: &mut [io::IoSliceMut]) -> io::Result<usize> {
todo!() // error: requires read
Err(std::io::Error::from_raw_os_error(libc::EBADF))
}
fn read_to_end(&self, buf: &mut Vec<u8>) -> io::Result<usize> {
todo!() // error: requires read
Err(std::io::Error::from_raw_os_error(libc::EBADF))
}
fn read_to_string(&self, buf: &mut String) -> io::Result<usize> {
todo!() // error: requires read
Err(std::io::Error::from_raw_os_error(libc::EBADF))
}
fn bytes(self) -> io::Bytes<std::fs::File> {
todo!() // error: requires read
todo!() // removing from trait
}
fn take(self, limit: u64) -> io::Take<std::fs::File> {
todo!() // error::requires read
todo!() // removing from trait
}
fn write(&self, buf: &[u8]) -> io::Result<usize> {
self.borrow().write(buf)
@ -292,10 +301,10 @@ impl<W: Write> FileIoExt for WritePipe<W> {
self.borrow().write_all(buf)
}
fn write_at(&self, buf: &[u8], offset: u64) -> io::Result<usize> {
todo!() // error: requires seek
Err(std::io::Error::from_raw_os_error(libc::EBADF))
}
fn write_all_at(&self, buf: &[u8], offset: u64) -> io::Result<()> {
todo!() // error: requires seek
Err(std::io::Error::from_raw_os_error(libc::EBADF))
}
fn write_vectored(&self, bufs: &[io::IoSlice]) -> io::Result<usize> {
self.borrow().write_vectored(bufs)
@ -307,10 +316,10 @@ impl<W: Write> FileIoExt for WritePipe<W> {
self.borrow().flush()
}
fn seek(&self, pos: std::io::SeekFrom) -> io::Result<u64> {
todo!() // error: requires seek
Err(std::io::Error::from_raw_os_error(libc::ESPIPE))
}
fn stream_position(&self) -> io::Result<u64> {
todo!() // error: requires seek
Err(std::io::Error::from_raw_os_error(libc::ESPIPE))
}
}
@ -335,21 +344,30 @@ impl<W: Write> WasiFile for WritePipe<W> {
Ok(Filetype::CharacterDevice) // XXX
}
fn get_fdflags(&self) -> Result<FdFlags, Error> {
todo!()
Ok(FdFlags::APPEND)
}
fn set_fdflags(&self, _fdflags: FdFlags) -> Result<(), Error> {
todo!()
Err(Error::Perm)
}
fn get_oflags(&self) -> Result<OFlags, Error> {
todo!()
Ok(OFlags::empty())
}
fn set_oflags(&self, _flags: OFlags) -> Result<(), Error> {
todo!()
Err(Error::Perm)
}
fn get_filestat(&self) -> Result<Filestat, Error> {
todo!()
Ok(Filestat {
device_id: 0,
inode: 0,
filetype: self.get_filetype()?,
nlink: 0,
size: 0, // XXX no way to get a size out of a Write :(
atim: None,
mtim: None,
ctim: None,
})
}
fn set_filestat_size(&self, _size: u64) -> Result<(), Error> {
todo!()
Err(Error::Perm)
}
}

Loading…
Cancel
Save