bsd-user: Implement dup and dup2
authorWarner Losh <imp@bsdimp.com>
Sun, 12 Jun 2022 15:27:19 +0000 (09:27 -0600)
committerWarner Losh <imp@bsdimp.com>
Tue, 14 Jun 2022 14:17:44 +0000 (08:17 -0600)
Signed-off-by: Stacey Son <sson@FreeBSD.org>
Signed-off-by: Warner Losh <imp@bsdimp.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
bsd-user/bsd-file.h
bsd-user/freebsd/os-syscall.c

index 8ec53145894a2797bfeff26ab942caafd734b249..021541ad2e0c408172eaa2b0041c9fe4f5a2ce57 100644 (file)
@@ -485,4 +485,16 @@ static abi_long do_bsd___getcwd(abi_long arg1, abi_long arg2)
     return get_errno(ret);
 }
 
+/* dup(2) */
+static abi_long do_bsd_dup(abi_long arg1)
+{
+    return get_errno(dup(arg1));
+}
+
+/* dup2(2) */
+static abi_long do_bsd_dup2(abi_long arg1, abi_long arg2)
+{
+    return get_errno(dup2(arg1, arg2));
+}
+
 #endif /* BSD_FILE_H */
index e28a566d6c3d3af78c74cb35b5dbf74f6781b96e..d9ebb9d50d681ba6ce5cdab3962dec73cde25d81 100644 (file)
@@ -349,6 +349,14 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
         ret = do_bsd___getcwd(arg1, arg2);
         break;
 
+    case TARGET_FREEBSD_NR_dup: /* dup(2) */
+        ret = do_bsd_dup(arg1);
+        break;
+
+    case TARGET_FREEBSD_NR_dup2: /* dup2(2) */
+        ret = do_bsd_dup2(arg1, arg2);
+        break;
+
     default:
         qemu_log_mask(LOG_UNIMP, "Unsupported syscall: %d\n", num);
         ret = -TARGET_ENOSYS;