From f388ebc4e3ecfcab558c895167579a7c64a85142 Mon Sep 17 00:00:00 2001 From: jason Date: Wed, 29 Apr 2026 04:30:46 -0400 Subject: [PATCH] sys/linux: emulate dup2 better on arm64 and riscv --- core/sys/linux/sys.odin | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/core/sys/linux/sys.odin b/core/sys/linux/sys.odin index 9bb7b122d..87e41fa29 100644 --- a/core/sys/linux/sys.odin +++ b/core/sys/linux/sys.odin @@ -419,7 +419,15 @@ dup :: proc "contextless" (fd: Fd) -> (Fd, Errno) { dup2 :: proc "contextless" (old: Fd, new: Fd) -> (Fd, Errno) { when ODIN_ARCH == .arm64 || ODIN_ARCH == .riscv64 { ret := syscall(SYS_dup3, old, new, 0) - return errno_unwrap(ret, Fd) + + // Differences between dup2 and dup3 are: + // - dup3 takes a flags argument + // - dup2 does not return EINVAL + fd, errno := errno_unwrap(ret, Fd) + if errno == .EINVAL { + errno = .NONE + } + return fd, errno } else { ret := syscall(SYS_dup2, old, new) return errno_unwrap(ret, Fd)