wasmer_wasix/journal/effector/syscalls/
fd_duplicate.rs1use super::*;
2
3impl JournalEffector {
4 pub fn save_fd_duplicate(
5 ctx: &mut FunctionEnvMut<'_, WasiEnv>,
6 original_fd: Fd,
7 copied_fd: Fd,
8 cloexec: bool,
9 ) -> anyhow::Result<()> {
10 Self::save_event(
11 ctx,
12 JournalEntry::DuplicateFileDescriptorV2 {
13 original_fd,
14 copied_fd,
15 cloexec,
16 },
17 )
18 }
19
20 pub fn apply_fd_duplicate(
21 ctx: &mut FunctionEnvMut<'_, WasiEnv>,
22 original_fd: Fd,
23 copied_fd: Fd,
24 cloexec: bool,
25 ) -> anyhow::Result<()> {
26 let ret_fd = crate::syscalls::fd_dup_internal(ctx, original_fd, 0, cloexec)
27 .map_err(|err| {
28 anyhow::format_err!(
29 "journal restore error: failed to duplicate file descriptor (original={original_fd}, copied={copied_fd}) - {err}")
30 })?;
31
32 if ret_fd != copied_fd {
33 let ret = crate::syscalls::fd_renumber_internal(ctx, ret_fd, copied_fd);
34 if !matches!(ret, Ok(Errno::Success)) {
35 bail!(
36 "journal restore error: failed renumber file descriptor after duplicate (from={}, to={}) - {}",
37 ret_fd,
38 copied_fd,
39 ret.unwrap_or(Errno::Unknown)
40 );
41 }
42 }
43
44 Ok(())
45 }
46}