MCPcopy Create free account
hub / github.com/PLSysSec/wave / writeback_fds

Function writeback_fds

src/poll.rs:202–260  ·  view source on GitHub ↗
(
    ctx: &mut VmCtx,
    out_ptr: u32,
    pollfds: &Vec<libc::pollfd>,
    fd_data: &Vec<(u64, SubscriptionFdType)>,
)

Source from the content-addressed store, hash-verified

200#[external_calls(from_posix, from_poll_revents, Some)]
201#[external_methods(to_event_type)]
202pub fn writeback_fds(
203 ctx: &mut VmCtx,
204 out_ptr: u32,
205 pollfds: &Vec<libc::pollfd>,
206 fd_data: &Vec<(u64, SubscriptionFdType)>,
207) -> RuntimeResult<u32> {
208 let mut num_events_written = 0;
209 let mut event_idx = 0;
210 while event_idx < fd_data.len() {
211 body_invariant!(ctx_safe(ctx));
212 body_invariant!(trace_safe(trace, ctx));
213
214 let (userdata, sub_type) = fd_data[event_idx];
215 // let typ = match sub_type {
216 // SubscriptionFdType::Read => EventType::FdRead,
217 // SubscriptionFdType::Write => EventType::FdWrite,
218 // };
219 let typ = sub_type.to_event_type();
220
221 let pollfd = pollfds[event_idx];
222
223 // if no event ocurred, continue
224 if pollfd.revents == 0 {
225 continue;
226 }
227
228 let event_offset = (num_events_written * Event::WASI_SIZE) as usize;
229 if !ctx.fits_in_lin_mem_usize(out_ptr as usize + event_offset, Event::WASI_SIZE as usize) {
230 return Err(Eoverflow);
231 }
232
233 // get the number of bytes for reading...
234 // TODO: If we want, we can remove this, and always return 1 for reads
235 let nbytes = match typ {
236 EventType::FdRead => trace_fionread(ctx, HostFd::from_raw(pollfd.fd as usize))? as u64,
237 // no way to check number of bytes for writing
238 _ => 0,
239 };
240
241 let fd_readwrite = EventFdReadWrite {
242 nbytes,
243 flags: EventRwFlags::from_posix(pollfd.revents),
244 };
245
246 let error = RuntimeError::from_poll_revents(pollfd.revents);
247
248 let event = Event {
249 userdata,
250 error,
251 typ,
252 fd_readwrite: Some(fd_readwrite),
253 };
254 event.write(ctx, out_ptr + event_offset as u32);
255 num_events_written += 1;
256
257 event_idx += 1;
258 }
259 return Ok(num_events_written);

Callers 1

wasi_poll_oneoffFunction · 0.85

Calls 5

trace_fionreadFunction · 0.85
to_event_typeMethod · 0.80
fits_in_lin_mem_usizeMethod · 0.80
writeMethod · 0.80
lenMethod · 0.45

Tested by

no test coverage detected