worker: add runOutput function
authorClinton Ebadi <clinton@unknownlamer.org>
Thu, 19 Apr 2018 05:20:49 +0000 (01:20 -0400)
committerClinton Ebadi <clinton@unknownlamer.org>
Thu, 19 Apr 2018 05:20:49 +0000 (01:20 -0400)
similar to shellOutput, but uses Unix.execute directly instead of
using bash, and returns both the return status and any output

src/slave.sig
src/slave.sml

index bfe5786..b6c90fa 100644 (file)
@@ -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
index 7e3f9d8..299c0ed 100644 (file)
@@ -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"])