wasmer_wasix/journal/effector/syscalls/
fd_duplicate.rs

1use 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}