| 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 | 
 |