From e5009cd41d1fadda741c5e56809c440be4fa66cd Mon Sep 17 00:00:00 2001 From: Troels Henriksen Date: Sat, 19 Jun 2021 15:59:15 +0200 Subject: [PATCH] Add Posix.IO.dup2, as specified by Basis Library. --- basis/POSIX_IO.sml | 1 + basis/Posix.sml | 4 ++++ src/Runtime/Posix.c | 6 ++++++ 3 files changed, 11 insertions(+) diff --git a/basis/POSIX_IO.sml b/basis/POSIX_IO.sml index f72384417..4a1fa0889 100644 --- a/basis/POSIX_IO.sml +++ b/basis/POSIX_IO.sml @@ -24,6 +24,7 @@ signature POSIX_IO = val close : file_desc -> unit val dup : file_desc -> file_desc + val dup2 : {old : file_desc, new : file_desc} -> unit val dupfd : {old : file_desc, base : file_desc} -> file_desc val pipe : unit -> {infd : file_desc, outfd : file_desc} diff --git a/basis/Posix.sml b/basis/Posix.sml index f97616559..198fe5656 100644 --- a/basis/Posix.sml +++ b/basis/Posix.sml @@ -823,6 +823,10 @@ struct fun dup f = dupfd {old = f, base = 0} + fun dup2 {old, new} = let val a = prim ("@sml_dup2", (old : int, new : int)) : int + in if a = ~1 then raiseSys "dup2" NONE "" else () + end + fun lseek (fd, p, w) = let val k = case w of SEEK_SET => 0 diff --git a/src/Runtime/Posix.c b/src/Runtime/Posix.c index fc58a27a2..f07ffb797 100644 --- a/src/Runtime/Posix.c +++ b/src/Runtime/Posix.c @@ -302,6 +302,12 @@ sml_dupfd(size_t f, size_t arg) return (size_t) fcntl((int) f, F_DUPFD, (long) arg); } +size_t +sml_dup2(size_t f, size_t t) +{ + return (size_t) dup2((int) f, (int) t); +} + uintptr_t sml_getStdNumbers(uintptr_t triple) {