From 7421bb04ad9ed42e89354daa5c9bb06f9ab91773 Mon Sep 17 00:00:00 2001 From: Clinton Ebadi Date: Thu, 19 Apr 2018 01:20:49 -0400 Subject: [PATCH] worker: add runOutput function similar to shellOutput, but uses Unix.execute directly instead of using bash, and returns both the return status and any output --- src/slave.sig | 2 ++ src/slave.sml | 25 ++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/slave.sig b/src/slave.sig index bfe5786..b6c90fa 100644 --- a/src/slave.sig +++ b/src/slave.sig @@ -47,6 +47,8 @@ signature SLAVE = sig val shellF : string list * (string -> string) -> unit val shellOutput : string list -> string option val run : string * string list -> bool + val runOutput : string * string list -> bool * string option + (* Like shellOutput, but return status and lines and don't use the shell *) val concatTo : (string -> bool) -> string -> unit (* Search through the result configuration hierarchy for all files matching diff --git a/src/slave.sml b/src/slave.sml index 7e3f9d8..299c0ed 100644 --- a/src/slave.sml +++ b/src/slave.sml @@ -36,7 +36,7 @@ type file_status = {action : file_action, val fileHandler = ref (fn _ : file_status => ()) val preHandler = ref (fn () => ()) val postHandler = ref (fn () => ()) - + fun registerFileHandler handler = let val old = !fileHandler @@ -96,6 +96,29 @@ fun run (program, argv) = OS.Process.isSuccess (Unix.reap proc) end + +fun runOutput (program, argv) = + let + val proc = Unix.execute (program, argv) + val inf = Unix.textInstreamOf proc + + fun loop out = + case TextIO.inputLine inf of + NONE => if (List.length out) > 0 then + SOME (String.concat (rev out)) + else + NONE + | SOME line => loop (line :: out) + + val lines = loop [] + in + case lines of + SOME lines => print lines + | NONE => (); + + (OS.Process.isSuccess (Unix.reap proc), lines) + end + fun shellOutput ss = let val proc = Unix.execute ("/bin/bash", ["-c", String.concat ss ^ " 2>&1"]) -- 2.20.1