Signed-off-by: Matthias Goergens <[email protected]>

 stdext/Makefile |   2 +-
 stdext/os.ml    |  30 ++++++++++++++++++++++++++++++
 stdext/os.mli   |   3 +++
 3 files changed, 34 insertions(+), 1 deletions(-)


# HG changeset patch
# User Matthias Goergens <[email protected]>
# Date 1272293888 -3600
# Node ID bc1d3f2ac83a28c07fef4a63105a314043b65c82
# Parent  f661b1b49b40cb8ec1b722421b71a847891203ab
stdext/Os: A simple module for running stuff on the command line.

Signed-off-by: Matthias Goergens <[email protected]>

diff -r f661b1b49b40 -r bc1d3f2ac83a stdext/Makefile
--- a/stdext/Makefile
+++ b/stdext/Makefile
@@ -22,7 +22,7 @@
 
 STDEXT_OBJS = fun listext filenameext stringext arrayext hashtblext pervasiveext threadext ring \
 	qring fring opt bigbuffer unixext range vIO trie config date encodings fe fecomms \
-	forkhelpers gzip sha1sum zerocheck base64 backtrace tar mapext
+	forkhelpers gzip sha1sum zerocheck base64 backtrace tar mapext os
 
 INTF = $(foreach obj, $(STDEXT_OBJS),$(obj).cmi)
 LIBS = stdext.cma stdext.cmxa
diff -r f661b1b49b40 -r bc1d3f2ac83a stdext/os.ml
--- /dev/null
+++ b/stdext/os.ml
@@ -0,0 +1,30 @@
+let check_exit_status = function
+  | Unix.WEXITED 0 -> true
+  | Unix.WEXITED r -> Printf.eprintf "warning: the process terminated with exit code (%d)\n%!" r; false
+  | Unix.WSIGNALED n -> Printf.eprintf "warning: the process was killed by a signal (number: %d)\n%!" n; false
+  | Unix.WSTOPPED n -> Printf.eprintf "warning: the process was stopped by a signal (number: %d)\n%!" n; false
+;;
+
+let was_successful = function
+  | Unix.WEXITED 0 -> true
+  | Unix.WEXITED r -> false
+  | Unix.WSIGNALED n -> false
+  | Unix.WSTOPPED n -> false
+
+let syscall : ?env:string array -> string -> string * string * Unix.process_status = fun ?(env=[| |]) cmd ->
+  print_endline cmd;
+  let ic, oc, ec = Unix.open_process_full cmd env in
+  let buf1 = Buffer.create 96
+  and buf2 = Buffer.create 48 in
+  (try
+     while true do Buffer.add_channel buf1 ic 1 done
+   with End_of_file -> ());
+  (try
+     while true do Buffer.add_channel buf2 ec 1 done
+   with End_of_file -> ());
+  let exit_status = Unix.close_process_full (ic, oc, ec) in
+  check_exit_status exit_status;
+  ( Buffer.contents buf1
+  , Buffer.contents buf2
+  , exit_status
+  )
diff -r f661b1b49b40 -r bc1d3f2ac83a stdext/os.mli
--- /dev/null
+++ b/stdext/os.mli
@@ -0,0 +1,3 @@
+val check_exit_status : Unix.process_status -> bool
+val was_successful : Unix.process_status -> bool
+val syscall : ?env:string array -> string -> string * string * Unix.process_status
_______________________________________________
xen-api mailing list
[email protected]
http://lists.xensource.com/mailman/listinfo/xen-api

Reply via email to