# HG changeset patch # User Matthias Goergens # 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 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