src/HOL/Tools/ATP/modUnix.ML
author quigley
Thu, 31 Mar 2005 19:29:26 +0200
changeset 15642 028059faa963
child 15700 970e0293dfb3
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15642
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
     1
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
     2
(****************************************************************)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
     3
(****** Slightly modified version of sml Unix structure *********)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
     4
(****************************************************************)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
     5
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
     6
type signal = Posix.Signal.signal
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
     7
datatype exit_status = datatype Posix.Process.exit_status
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
     8
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
     9
val fromStatus = Posix.Process.fromStatus
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    10
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    11
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    12
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    13
(* Internal function - inverse of Posix.Process.fromStatus. *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    14
local
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    15
	val doCall = RunCall.run_call2 RuntimeCalls.POLY_SYS_os_specific
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    16
	in
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    17
		fun toStatus W_EXITED: OS.Process.status = doCall(16, (1, 0))
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    18
		 |  toStatus(W_EXITSTATUS w) = doCall(16, (1, Word8.toInt w))
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    19
		 |  toStatus(W_SIGNALED s) =
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    20
		 	doCall(16, (2, SysWord.toInt(Posix.Signal.toWord s)))
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    21
		 |  toStatus(W_STOPPED s) = 
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    22
		 	doCall(16, (3, SysWord.toInt(Posix.Signal.toWord s)))
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    23
	end
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    24
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    25
(*	fun reap{pid, infd, outfd} =
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    26
	let
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    27
		val u = Posix.IO.close infd;
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    28
		val u = Posix.IO.close outfd;
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    29
		val (_, status) =
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    30
			Posix.Process.waitpid(Posix.Process.W_CHILD pid, [])
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    31
	in
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    32
		toStatus status
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    33
	end
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    34
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    35
*)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    36
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    37
	fun reap(pid, instr, outstr) =
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    38
	let
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    39
		val u = TextIO.closeIn instr;
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    40
	        val u = TextIO.closeOut outstr;
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    41
	
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    42
		val (_, status) =
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    43
			Posix.Process.waitpid(Posix.Process.W_CHILD pid, [])
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    44
	in
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    45
		toStatus status
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    46
	end
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    47
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    48
fun fdReader (name : string, fd : Posix.IO.file_desc) =
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    49
	  Posix.IO.mkReader {initBlkMode = true,name = name,fd = fd };
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    50
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    51
fun fdWriter (name, fd) =
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    52
          Posix.IO.mkWriter {
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    53
	      appendMode = false,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    54
              initBlkMode = true,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    55
              name = name,  
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    56
              chunkSize=4096,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    57
              fd = fd
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    58
            };
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    59
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    60
fun openOutFD (name, fd) =
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    61
	  TextIO.mkOutstream (
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    62
	    TextIO.StreamIO.mkOutstream (
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    63
	      fdWriter (name, fd), IO.BLOCK_BUF));
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    64
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    65
fun openInFD (name, fd) =
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    66
	  TextIO.mkInstream (
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    67
	    TextIO.StreamIO.mkInstream (
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    68
	      fdReader (name, fd), ""));
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    69
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    70
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    71
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    72
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    73
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    74
(*****************************************)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    75
(*  The result of calling createWatcher  *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    76
(*****************************************)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    77
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    78
datatype proc = PROC of {
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    79
        pid : Posix.Process.pid,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    80
        instr : TextIO.instream,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    81
        outstr : TextIO.outstream
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    82
      };
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    83
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    84
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    85
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    86
(*****************************************)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    87
(*  The result of calling executeToList  *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    88
(*****************************************)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    89
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    90
datatype cmdproc = CMDPROC of {
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    91
        prover: string,             (* Name of the resolution prover used, e.g. Vampire, SPASS *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    92
        cmd:  string,              (* The file containing the goal for res prover to prove *)     
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    93
        thmstring: string,         (* string representation of subgoal after negation, skolemization*) 
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    94
        goalstring: string,         (* string representation of subgoal*) 
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    95
        pid : Posix.Process.pid,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    96
        instr : TextIO.instream,   (*  Input stream to child process *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    97
        outstr : TextIO.outstream  (*  Output stream from child process *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    98
      };
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    99
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   100
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   101
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   102
fun killChild pid = Posix.Process.kill(Posix.Process.K_PROC pid, Posix.Signal.kill);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   103
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   104
fun childInfo (PROC{pid,instr,outstr}) = ((pid, (instr,outstr)));
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   105
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   106
fun cmdstreamsOf (CMDPROC{instr,outstr,...}) = (instr, outstr);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   107
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   108
fun cmdInStream (CMDPROC{instr,outstr,...}) = (instr);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   109
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   110
fun cmdchildInfo (CMDPROC{prover,cmd,thmstring,goalstring,pid,instr,outstr}) = (prover,(cmd,(pid, (instr,outstr))));
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   111
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   112
fun cmdchildPid (CMDPROC{prover,cmd,thmstring,goalstring,pid,instr,outstr})  = (pid);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   113
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   114
fun cmdProver (CMDPROC{prover,cmd,thmstring,goalstring,pid,instr,outstr})  = (prover);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   115
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   116
fun cmdThm (CMDPROC{prover,cmd,thmstring,goalstring,pid,instr,outstr})  = (thmstring);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   117
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   118
fun cmdGoal (CMDPROC{prover,cmd,thmstring,goalstring,pid,instr,outstr})  = (goalstring);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   119
(***************************************************************************)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   120
(*  Takes a command - e.g. 'vampire', a list of arguments for the command, *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   121
(*  and a list of currently running processes.  Creates a new process for  *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   122
(*  cmd and argv and adds it to procList                                   *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   123
(***************************************************************************)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   124
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   125
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   126
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   127
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   128
fun mySshExecuteToList (cmd, argv, procList) = let
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   129
          val p1 = Posix.IO.pipe ()
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   130
          val p2 = Posix.IO.pipe ()
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   131
          val prover = hd argv
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   132
          val thmstring = hd(tl argv)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   133
          val goalstring = hd(tl(tl argv))
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   134
          val argv = tl (tl argv)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   135
          
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   136
          (* Turn the arguments into a single string.  Perhaps we should quote the
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   137
                   arguments.  *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   138
                fun convArgs [] = []
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   139
                  | convArgs [s] = [s]
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   140
                  | convArgs (hd::tl) = hd :: " " :: convArgs tl
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   141
                val cmd_args = concat(convArgs(cmd :: argv))
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   142
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   143
	  fun closep () = (
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   144
                Posix.IO.close (#outfd p1); 
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   145
                Posix.IO.close (#infd p1);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   146
                Posix.IO.close (#outfd p2); 
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   147
                Posix.IO.close (#infd p2)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   148
              )
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   149
          fun startChild () =(case  Posix.Process.fork()
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   150
		 of SOME pid =>  pid           (* parent *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   151
                  | NONE => let                 
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   152
		      val oldchildin = #infd p1
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   153
		      val newchildin = Posix.FileSys.wordToFD 0w0
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   154
		      val oldchildout = #outfd p2
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   155
		      val newchildout = Posix.FileSys.wordToFD 0w1
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   156
                      (*val args = (["shep"]@([cmd]@argv))
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   157
                      val newcmd = "/usr/bin/ssh"*)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   158
                      
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   159
                      in
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   160
			Posix.IO.close (#outfd p1);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   161
			Posix.IO.close (#infd p2);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   162
			Posix.IO.dup2{old = oldchildin, new = newchildin};
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   163
                        Posix.IO.close oldchildin;
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   164
			Posix.IO.dup2{old = oldchildout, new = newchildout};
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   165
                        Posix.IO.close oldchildout;
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   166
                       (* Run the command. *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   167
                       (* Run this as a shell command.  The command and arguments have
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   168
                          to be a single argument. *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   169
                       Posix.Process.exec("/bin/sh", ["sh", "-c", cmd_args])
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   170
			(*Posix.Process.exec(newcmd, args)*)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   171
		      end
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   172
		(* end case *))
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   173
          val _ = TextIO.flushOut TextIO.stdOut
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   174
          val pid = (startChild ()) handle ex => (closep(); raise ex)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   175
	  val instr = openInFD ("_exec_in", #infd p2)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   176
          val outstr = openOutFD ("_exec_out", #outfd p1)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   177
          val cmd = hd (rev argv)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   178
          in
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   179
              (* close the child-side fds *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   180
            Posix.IO.close (#outfd p2);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   181
            Posix.IO.close (#infd p1);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   182
              (* set the fds close on exec *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   183
            Posix.IO.setfd (#infd p2, Posix.IO.FD.flags [Posix.IO.FD.cloexec]);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   184
            Posix.IO.setfd (#outfd p1, Posix.IO.FD.flags [Posix.IO.FD.cloexec]);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   185
            (((CMDPROC{
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   186
              prover = prover,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   187
              cmd = cmd,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   188
              thmstring = thmstring,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   189
              goalstring = goalstring,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   190
              pid = pid,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   191
              instr = instr,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   192
              outstr = outstr
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   193
            })::procList))
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   194
          end;
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   195
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   196
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   197
fun myexecuteInEnv (cmd, argv, env) = let
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   198
          val p1 = Posix.IO.pipe ()
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   199
          val p2 = Posix.IO.pipe ()
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   200
          fun closep () = (
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   201
                Posix.IO.close (#outfd p1); 
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   202
                Posix.IO.close (#infd p1);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   203
                Posix.IO.close (#outfd p2); 
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   204
                Posix.IO.close (#infd p2)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   205
              )
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   206
          fun startChild () =(case  Posix.Process.fork()
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   207
                 of SOME pid =>  pid           (* parent *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   208
                  | NONE => let
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   209
                      val oldchildin = #infd p1
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   210
                      val newchildin = Posix.FileSys.wordToFD 0w0
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   211
                      val oldchildout = #outfd p2
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   212
                      val newchildout = Posix.FileSys.wordToFD 0w1
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   213
                      in
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   214
                        Posix.IO.close (#outfd p1);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   215
                        Posix.IO.close (#infd p2);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   216
                        Posix.IO.dup2{old = oldchildin, new = newchildin};
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   217
                        Posix.IO.close oldchildin;
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   218
                        Posix.IO.dup2{old = oldchildout, new = newchildout};
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   219
                        Posix.IO.close oldchildout;
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   220
                        Posix.Process.exece(cmd, argv, env)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   221
                      end
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   222
                (* end case *))
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   223
          val _ = TextIO.flushOut TextIO.stdOut
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   224
          val pid = (startChild ()) handle ex => (closep(); raise ex)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   225
          val instr = openInFD ("_exec_in", #infd p2)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   226
          val outstr = openOutFD ("_exec_out", #outfd p1)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   227
          in
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   228
              (* close the child-side fds *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   229
            Posix.IO.close (#outfd p2);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   230
            Posix.IO.close (#infd p1);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   231
              (* set the fds close on exec *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   232
            Posix.IO.setfd (#infd p2, Posix.IO.FD.flags [Posix.IO.FD.cloexec]);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   233
            Posix.IO.setfd (#outfd p1, Posix.IO.FD.flags [Posix.IO.FD.cloexec]);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   234
            PROC{pid = pid,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   235
              instr = instr,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   236
              outstr = outstr
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   237
            }
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   238
          end;
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   239
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   240
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   241
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   242
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   243
fun myexecuteToList (cmd, argv, procList) = let
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   244
          val p1 = Posix.IO.pipe ()
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   245
          val p2 = Posix.IO.pipe ()
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   246
          val prover = hd argv
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   247
          val thmstring = hd(tl argv)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   248
          val goalstring = hd(tl(tl argv))
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   249
          val argv = tl (tl (tl(argv)))
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   250
          
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   251
	  fun closep () = (
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   252
                Posix.IO.close (#outfd p1); 
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   253
                Posix.IO.close (#infd p1);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   254
                Posix.IO.close (#outfd p2); 
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   255
                Posix.IO.close (#infd p2)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   256
              )
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   257
          fun startChild () =(case  Posix.Process.fork()
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   258
		 of SOME pid =>  pid           (* parent *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   259
                  | NONE => let
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   260
		      val oldchildin = #infd p1
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   261
		      val newchildin = Posix.FileSys.wordToFD 0w0
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   262
		      val oldchildout = #outfd p2
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   263
		      val newchildout = Posix.FileSys.wordToFD 0w1
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   264
                      in
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   265
			Posix.IO.close (#outfd p1);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   266
			Posix.IO.close (#infd p2);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   267
			Posix.IO.dup2{old = oldchildin, new = newchildin};
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   268
                        Posix.IO.close oldchildin;
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   269
			Posix.IO.dup2{old = oldchildout, new = newchildout};
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   270
                        Posix.IO.close oldchildout;
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   271
			Posix.Process.exec(cmd, argv)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   272
		      end
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   273
		(* end case *))
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   274
          val _ = TextIO.flushOut TextIO.stdOut
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   275
          val pid = (startChild ()) handle ex => (closep(); raise ex)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   276
	  val instr = openInFD ("_exec_in", #infd p2)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   277
          val outstr = openOutFD ("_exec_out", #outfd p1)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   278
          val cmd = hd (rev argv)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   279
          in
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   280
              (* close the child-side fds *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   281
            Posix.IO.close (#outfd p2);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   282
            Posix.IO.close (#infd p1);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   283
              (* set the fds close on exec *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   284
            Posix.IO.setfd (#infd p2, Posix.IO.FD.flags [Posix.IO.FD.cloexec]);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   285
            Posix.IO.setfd (#outfd p1, Posix.IO.FD.flags [Posix.IO.FD.cloexec]);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   286
            (((CMDPROC{
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   287
              prover = prover,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   288
              cmd = cmd,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   289
              thmstring = thmstring,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   290
              goalstring = goalstring,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   291
              pid = pid,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   292
              instr = instr,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   293
              outstr = outstr
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   294
            })::procList))
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   295
          end;