summaryrefslogtreecommitdiffstats
path: root/otherlibs/unix
diff options
context:
space:
mode:
authorXavier Leroy <xavier.leroy@inria.fr>1999-10-18 09:43:24 +0000
committerXavier Leroy <xavier.leroy@inria.fr>1999-10-18 09:43:24 +0000
commit6932d23152b932190b38c434d63b374f432488cc (patch)
tree9ef71c29aeb7cf121812beb58fe3e311f3fb17d0 /otherlibs/unix
parenteac91f5d1fc4e0386a5d45a5ed608cd4879e2863 (diff)
Ajout de open_process_full
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@2441 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
Diffstat (limited to 'otherlibs/unix')
-rw-r--r--otherlibs/unix/unix.ml32
-rw-r--r--otherlibs/unix/unix.mli14
2 files changed, 43 insertions, 3 deletions
diff --git a/otherlibs/unix/unix.ml b/otherlibs/unix/unix.ml
index 011ac5d3a..61a08de22 100644
--- a/otherlibs/unix/unix.ml
+++ b/otherlibs/unix/unix.ml
@@ -569,6 +569,7 @@ type popen_process =
Process of in_channel * out_channel
| Process_in of in_channel
| Process_out of out_channel
+ | Process_full of in_channel * out_channel * in_channel
let popen_processes = (Hashtbl.create 7 : (popen_process, int) Hashtbl.t)
@@ -606,6 +607,30 @@ let open_process cmd =
close in_write;
(inchan, outchan)
+let open_proc_full cmd env proc input output error toclose =
+ match fork() with
+ 0 -> dup2 input stdin; close input;
+ dup2 output stdout; close output;
+ dup2 error stderr; close error;
+ List.iter close toclose;
+ execve "/bin/sh" [| "/bin/sh"; "-c"; cmd |] env;
+ exit 127
+ | id -> Hashtbl.add popen_processes proc id
+
+let open_process_full cmd env =
+ let (in_read, in_write) = pipe() in
+ let (out_read, out_write) = pipe() in
+ let (err_read, err_write) = pipe() in
+ let inchan = in_channel_of_descr in_read in
+ let outchan = out_channel_of_descr out_write in
+ let errchan = in_channel_of_descr err_read in
+ open_proc_full cmd env (Process_full(inchan, outchan, errchan))
+ out_read in_write err_write [in_read; out_write; err_read];
+ close out_read;
+ close in_write;
+ close err_write;
+ (inchan, outchan, errchan)
+
let find_proc_id fun_name proc =
try
let pid = Hashtbl.find popen_processes proc in
@@ -629,6 +654,13 @@ let close_process (inchan, outchan) =
close_in inchan; close_out outchan;
snd(waitpid [] pid)
+let close_process_full (inchan, outchan, errchan) =
+ let pid =
+ find_proc_id "close_process_full"
+ (Process_full(inchan, outchan, errchan)) in
+ close_in inchan; close_out outchan; close_in errchan;
+ snd(waitpid [] pid)
+
(* High-level network functions *)
let open_connection sockaddr =
diff --git a/otherlibs/unix/unix.mli b/otherlibs/unix/unix.mli
index 5fac6cd99..8ede09552 100644
--- a/otherlibs/unix/unix.mli
+++ b/otherlibs/unix/unix.mli
@@ -439,12 +439,20 @@ val open_process: string -> in_channel * out_channel
by the shell [/bin/sh] (cf. [system]). Warning: writes on channels
are buffered, hence be careful to call [flush] at the right times
to ensure correct synchronization. *)
+val open_process_full:
+ string -> string array -> in_channel * out_channel * in_channel
+ (* Similar to [open_process], but the second argument specifies
+ the environment passed to the command. The result is a triple
+ of channels connected to the standard output, standard input,
+ and standard error of the command. *)
val close_process_in: in_channel -> process_status
val close_process_out: out_channel -> process_status
val close_process: in_channel * out_channel -> process_status
- (* Close channels opened by [open_process_in], [open_process_out]
- and [open_process], respectively, wait for the associated
- command to terminate, and return its termination status. *)
+val close_process_full: in_channel * out_channel * in_channel -> process_status
+ (* Close channels opened by [open_process_in], [open_process_out],
+ [open_process] and [open_process_full], respectively,
+ wait for the associated command to terminate,
+ and return its termination status. *)
(*** Symbolic links *)