| 
26220
 | 
     1  | 
(*  Title:      Pure/ML-Systems/system_shell.ML
  | 
| 
 | 
     2  | 
    Author:     Makarius
  | 
| 
 | 
     3  | 
  | 
| 
 | 
     4  | 
Generic system shell processes (no provisions to propagate interrupts;
  | 
| 
 | 
     5  | 
might still work via the controlling tty).
  | 
| 
 | 
     6  | 
*)
  | 
| 
 | 
     7  | 
  | 
| 
 | 
     8  | 
local
  | 
| 
 | 
     9  | 
  | 
| 
 | 
    10  | 
fun read_file name =
  | 
| 
 | 
    11  | 
  let val is = TextIO.openIn name
  | 
| 
26504
 | 
    12  | 
  in Exn.release (Exn.capture TextIO.inputAll is before TextIO.closeIn is) end;
  | 
| 
26220
 | 
    13  | 
  | 
| 
 | 
    14  | 
fun write_file name txt =
  | 
| 
 | 
    15  | 
  let val os = TextIO.openOut name
  | 
| 
26504
 | 
    16  | 
  in Exn.release (Exn.capture TextIO.output (os, txt) before TextIO.closeOut os) end;
  | 
| 
26220
 | 
    17  | 
  | 
| 
 | 
    18  | 
in
  | 
| 
 | 
    19  | 
  | 
| 
 | 
    20  | 
fun system_out script =
  | 
| 
 | 
    21  | 
  let
  | 
| 
 | 
    22  | 
    val script_name = OS.FileSys.tmpName ();
  | 
| 
 | 
    23  | 
    val _ = write_file script_name script;
  | 
| 
 | 
    24  | 
  | 
| 
 | 
    25  | 
    val output_name = OS.FileSys.tmpName ();
  | 
| 
 | 
    26  | 
  | 
| 
 | 
    27  | 
    val status =
  | 
| 
 | 
    28  | 
      OS.Process.system ("perl -w \"$ISABELLE_HOME/lib/scripts/system.pl\" nogroup " ^
 | 
| 
 | 
    29  | 
        script_name ^ " /dev/null " ^ output_name);
  | 
| 
 | 
    30  | 
    val rc =
  | 
| 
 | 
    31  | 
      (case Posix.Process.fromStatus status of
  | 
| 
 | 
    32  | 
        Posix.Process.W_EXITED => 0
  | 
| 
 | 
    33  | 
      | Posix.Process.W_EXITSTATUS w => Word8.toInt w
  | 
| 
 | 
    34  | 
      | Posix.Process.W_SIGNALED s => 256 + LargeWord.toInt (Posix.Signal.toWord s)
  | 
| 
 | 
    35  | 
      | Posix.Process.W_STOPPED s => 512 + LargeWord.toInt (Posix.Signal.toWord s));
  | 
| 
 | 
    36  | 
  | 
| 
 | 
    37  | 
    val output = read_file output_name handle IO.Io _ => "";
  | 
| 
 | 
    38  | 
    val _ = OS.FileSys.remove script_name handle OS.SysErr _ => ();
  | 
| 
 | 
    39  | 
    val _ = OS.FileSys.remove output_name handle OS.SysErr _ => ();
  | 
| 
 | 
    40  | 
  in (output, rc) end;
  | 
| 
 | 
    41  | 
  | 
| 
 | 
    42  | 
end;
  | 
| 
 | 
    43  | 
  |